aGrUM  0.16.0
bijection.h
Go to the documentation of this file.
1 
33 #ifndef GUM_BIJECTION_H
34 #define GUM_BIJECTION_H
35 
36 #include <initializer_list>
37 #include <iostream>
38 #include <sstream>
39 #include <string>
40 #include <type_traits>
41 
42 #include <agrum/core/hashTable.h>
43 
44 namespace gum {
45 
46 #ifndef DOXYGEN_SHOULD_SKIP_THIS
47 
48  template < typename T1, typename T2 >
49  class BijectionIteratorSafe;
50  template < typename T1, typename T2 >
51  class BijectionIterator;
52  template < typename T1, typename T2, typename Alloc, bool >
53  class BijectionImplementation;
54  template < typename T1, typename T2, typename Alloc >
55  class Bijection;
56 
57 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
58 
59 
60  // ===========================================================================
61  // === NON SCALAR BIJECTION IMPLEMENTATION ===
62  // ===========================================================================
63 
84  template < typename T1, typename T2, typename Alloc, bool Gen >
86  public:
89  using type1_type = T1;
90  using type1_reference = T1&;
91  using type1_const_reference = const T1&;
92  using type1_pointer = T1*;
93  using type1_const_pointer = const T1*;
94  using type2_type = T2;
95  using type2_reference = T2&;
96  using type2_const_reference = const T2&;
97  using type2_pointer = T2*;
98  using type2_const_pointer = const T2*;
99  using size_type = std::size_t;
100  using difference_type = std::ptrdiff_t;
101  using allocator_type = Alloc;
106  using allocator12_type =
107  typename Alloc::template rebind< std::pair< T1, T2* > >::other;
108  using allocator21_type =
109  typename Alloc::template rebind< std::pair< T2, T1* > >::other;
111 
112  private:
120  BijectionImplementation(Size size, bool resize_policy);
121 
126  BijectionImplementation(std::initializer_list< std::pair< T1, T2 > > list);
127 
134 
139  template < typename OtherAlloc >
142 
149 
150  public:
151  // ============================================================================
153  // ============================================================================
155 
160 
162 
163  private:
171 
177  template < typename OtherAlloc >
180 
188 
189  public:
190  // ============================================================================
192  // ============================================================================
194 
216  iterator begin() const;
217 
239  const_iterator cbegin() const;
240 
261  const iterator& end() const noexcept;
262 
283  const const_iterator& cend() const noexcept;
284 
306  iterator_safe beginSafe() const;
307 
331 
353  const iterator_safe& endSafe() const noexcept;
354 
377  const const_iterator_safe& cendSafe() const noexcept;
378 
414  static const iterator_safe& endSafe4Statics();
415 
451  static const iterator& end4Statics();
452 
454  // ============================================================================
456  // ============================================================================
458 
465  const T1& first(const T2& second) const;
466 
476  const T1& firstWithDefault(const T2& second, const T1& default_val) const;
477 
484  const T2& second(const T1& first) const;
485 
495  const T2& secondWithDefault(const T1& second, const T2& default_val) const;
496 
504  bool existsFirst(const T1& first) const;
505 
513  bool existsSecond(const T2& second) const;
514 
524  void insert(const T1& first, const T2& second);
525 
535  void insert(T1&& first, T2&& second);
536 
547  template < typename... Args >
548  void emplace(Args&&... args);
549 
553  void clear();
554 
561  bool empty() const noexcept;
562 
569  Size size() const noexcept;
570 
579  void eraseFirst(const T1& first);
580 
589  void eraseSecond(const T2& second);
590 
595  std::string toString() const;
596 
598  // ============================================================================
600  // ============================================================================
602 
607  Size capacity() const noexcept;
608 
616  void resize(Size new_size);
617 
625  void setResizePolicy(const bool new_policy) noexcept;
626 
634  bool resizePolicy() const noexcept;
635 
637 
638  private:
644 
647  friend class BijectionIteratorSafe< T1, T2 >;
648  friend class BijectionIterator< T1, T2 >;
649  friend class Bijection< T1, T2, Alloc >;
650  template < typename TT1, typename TT2, typename A, bool >
653 
654  // Below, we create the two gum::HashTable used by the gum::Bijection. Note
655  // that the values of these gum::HashTable are pointers. This enables to
656  // create only once objects (T1,T2). When using gum::Bijection with large
657  // size objects, this feature is of particular interest.
658 
661 
664 
674  template < typename OtherAlloc >
675  void __copy(const HashTable< T1, T2*, OtherAlloc >& source);
676 
683  typename HashTable12::value_type* __insert(const T1& first, const T2& second);
684 
691  typename HashTable12::value_type* __insert(T1&& first, T2&& second);
692  };
693 
694 #ifndef DOXYGEN_SHOULD_SKIP_THIS
695 
696  // ===========================================================================
697  // === SCALAR BIJECTION IMPLEMENTATION ===
698  // ===========================================================================
699 
723  template < typename T1, typename T2, typename Alloc >
724  class BijectionImplementation< T1, T2, Alloc, true > {
725  public:
728  using type1_type = T1;
729  using type1_reference = T1&;
730  using type1_const_reference = const T1&;
731  using type1_pointer = T1*;
732  using type1_const_pointer = const T1*;
733  using type2_type = T2;
734  using type2_reference = T2&;
735  using type2_const_reference = const T2&;
736  using type2_pointer = T2*;
737  using type2_const_pointer = const T2*;
738  using size_type = std::size_t;
739  using difference_type = std::ptrdiff_t;
740  using allocator_type = Alloc;
745 
746  using allocator12_type =
747  typename Alloc::template rebind< std::pair< T1, T2 > >::other;
748  using allocator21_type =
749  typename Alloc::template rebind< std::pair< T2, T1 > >::other;
751 
752  private:
760  BijectionImplementation(Size size, bool resize_policy);
761 
766  BijectionImplementation(std::initializer_list< std::pair< T1, T2 > > list);
767 
774 
779  template < typename OtherAlloc >
782 
789 
790  public:
791  // ============================================================================
793  // ============================================================================
795 
800 
802 
803  private:
811 
817  template < typename OtherAlloc >
820 
828 
829  public:
830  // ============================================================================
832  // ============================================================================
834 
856  iterator begin() const;
857 
879  const_iterator cbegin() const;
880 
901  const iterator& end() const noexcept;
902 
923  const const_iterator& cend() const noexcept;
924 
946  iterator_safe beginSafe() const;
947 
971 
993  const iterator_safe& endSafe() const noexcept;
994 
1017  const const_iterator_safe& cendSafe() const noexcept;
1018 
1054  static const iterator_safe& endSafe4Statics();
1055 
1091  static const iterator& end4Statics();
1092 
1094  // ============================================================================
1096  // ============================================================================
1098 
1105  const T1& first(T2 second) const;
1106 
1116  const T1& firstWithDefault(T2 second, T1 default_val) const;
1117 
1124  const T2& second(T1 first) const;
1125 
1135  const T2& secondWithDefault(T1 first, T2 default_val) const;
1136 
1144  bool existsFirst(T1 first) const;
1145 
1153  bool existsSecond(T2 second) const;
1154 
1164  void insert(T1 first, T2 second);
1165 
1176  template < typename... Args >
1177  void emplace(Args&&... args);
1178 
1182  void clear();
1183 
1190  bool empty() const noexcept;
1191 
1198  Size size() const noexcept;
1199 
1208  void eraseFirst(T1 first);
1209 
1218  void eraseSecond(T2 second);
1219 
1224  std::string toString() const;
1225 
1227  // ============================================================================
1229  // ============================================================================
1231 
1236  Size capacity() const noexcept;
1237 
1245  void resize(Size new_size);
1246 
1254  void setResizePolicy(const bool new_policy) noexcept;
1255 
1263  bool resizePolicy() const noexcept;
1264 
1266 
1267  private:
1273 
1276  friend class BijectionIteratorSafe< T1, T2 >;
1277  friend class BijectionIterator< T1, T2 >;
1278  friend class Bijection< T1, T2, Alloc >;
1279  template < typename TT1, typename TT2, typename A, bool >
1280  friend class BijectionImplementation;
1282 
1283  // Below, we create the two gum::HashTable used by the gum::Bijection. Note
1284  // that the values of these gum::HashTable are pointers. This enables to
1285  // create only once objects (T1,T2). When using gum::Bijection with large
1286  // size objects, this feature is of particular interest.
1287 
1290 
1293 
1303  template < typename OtherAlloc >
1304  void __copy(const HashTable< T1, T2, OtherAlloc >& f2s);
1305 
1312  void __insert(const T1 first, const T2 second);
1313  };
1314 
1315 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
1316 
1329  template < typename T1, typename T2, typename Alloc, bool >
1330  friend class BijectionImplementation;
1331 
1332  private:
1335 
1338 
1345 
1351  };
1352 
1362  template < bool gen >
1369  template < typename T >
1370  INLINE static const T& op_second(const T* x) {
1371  return *x;
1372  }
1373  };
1374 
1384  template <>
1385  struct BijectionIteratorGet< true > {
1391  template < typename T >
1392  INLINE static const T& op_second(const T& x) {
1393  return x;
1394  }
1395  };
1396 
1397  // ===========================================================================
1398  // === BIJECTION SAFE ITERATORS ===
1399  // ===========================================================================
1400 
1410  template < typename T1, typename T2 >
1412  template < typename TT1, typename TT2, typename Alloc, bool >
1413  friend class BijectionImplementation;
1414 
1415  public:
1418  using iterator_category = std::forward_iterator_tag;
1419  using type1_type = T1;
1420  using type1_reference = T1&;
1421  using type1_const_reference = const T1&;
1422  using type1_pointer = T1*;
1423  using type1_const_pointer = const T1*;
1424  using type2_type = T2;
1425  using type2_reference = T2&;
1426  using type2_const_reference = const T2&;
1427  using type2_pointer = T2*;
1428  using type2_const_pointer = const T2*;
1429  using difference_type = std::ptrdiff_t;
1431 
1432  private:
1438  && std::is_scalar< T2 >::value >;
1439 
1446  template < typename Alloc, bool Gen >
1449 
1450  public:
1451  // ============================================================================
1453  // ============================================================================
1455 
1459  BijectionIteratorSafe() noexcept;
1460 
1465  template < typename Alloc >
1466  BijectionIteratorSafe(const Bijection< T1, T2, Alloc >& bijection);
1467 
1472  BijectionIteratorSafe(const BijectionIteratorSafe< T1, T2 >& from);
1473 
1478  BijectionIteratorSafe(BijectionIteratorSafe< T1, T2 >&& from) noexcept;
1479 
1483  ~BijectionIteratorSafe() noexcept;
1484 
1486  // ============================================================================
1488  // ============================================================================
1490 
1496  BijectionIteratorSafe< T1, T2 >&
1497  operator=(const BijectionIteratorSafe< T1, T2 >& toCopy);
1498 
1504  BijectionIteratorSafe< T1, T2 >&
1505  operator=(BijectionIteratorSafe< T1, T2 >&& toMove) noexcept;
1506 
1513  BijectionIteratorSafe< T1, T2 >& operator++() noexcept;
1514 
1526  BijectionIteratorSafe< T1, T2 >& operator+=(Size nb) noexcept;
1527 
1539  BijectionIteratorSafe< T1, T2 > operator+(Size nb) noexcept;
1540 
1546  bool operator!=(const BijectionIteratorSafe< T1, T2 >& toCompare) const
1547  noexcept;
1548 
1554  bool operator==(const BijectionIteratorSafe< T1, T2 >& toCompare) const
1555  noexcept;
1556 
1558  // ============================================================================
1560  // ============================================================================
1562 
1569  const T1& first() const;
1570 
1577  const T2& second() const;
1578 
1580 
1581  private:
1583  using HashTable12 = typename std::conditional<
1584  std::is_scalar< T1 >::value && std::is_scalar< T2 >::value,
1585  HashTable< T1, T2, std::allocator< std::pair< T1, T2 > > >,
1586  HashTable< T1, T2*, std::allocator< std::pair< T1, T2* > > > >::type;
1587 
1591 
1593  HashIter __iter;
1594  };
1595 
1596  // ===========================================================================
1597  // === BIJECTION UNSAFE ITERATORS ===
1598  // ===========================================================================
1608  template < typename T1, typename T2 >
1610  template < typename TT1, typename TT2, typename Alloc, bool >
1611  friend class BijectionImplementation;
1612 
1613  public:
1616  using iterator_category = std::forward_iterator_tag;
1617  using type1_type = T1;
1618  using type1_reference = T1&;
1619  using type1_const_reference = const T1&;
1620  using type1_pointer = T1*;
1621  using type1_const_pointer = const T1*;
1622  using type2_type = T2;
1623  using type2_reference = T2&;
1624  using type2_const_reference = const T2&;
1625  using type2_pointer = T2*;
1626  using type2_const_pointer = const T2*;
1627  using difference_type = std::ptrdiff_t;
1629 
1630  private:
1636  && std::is_scalar< T2 >::value >;
1637 
1642  template < typename Alloc, bool Gen >
1643  BijectionIterator(
1645 
1646  public:
1647  // ============================================================================
1649  // ============================================================================
1651 
1655  BijectionIterator() noexcept;
1656 
1661  template < typename Alloc >
1662  BijectionIterator(const Bijection< T1, T2, Alloc >& bijection);
1663 
1668  BijectionIterator(const BijectionIterator< T1, T2 >& from);
1669 
1674  BijectionIterator(BijectionIterator< T1, T2 >&& from) noexcept;
1675 
1679  ~BijectionIterator() noexcept;
1680 
1682  // ============================================================================
1684  // ============================================================================
1686 
1692  BijectionIterator< T1, T2 >&
1693  operator=(const BijectionIterator< T1, T2 >& toCopy);
1694 
1700  BijectionIterator< T1, T2 >&
1701  operator=(BijectionIterator< T1, T2 >&& toMove) noexcept;
1702 
1710  BijectionIterator< T1, T2 >& operator++() noexcept;
1711 
1723  BijectionIterator< T1, T2 >& operator+=(Size nb) noexcept;
1724 
1733  BijectionIterator< T1, T2 > operator+(Size nb) noexcept;
1734 
1740  bool operator!=(const BijectionIterator< T1, T2 >& toCompare) const noexcept;
1741 
1747  bool operator==(const BijectionIterator< T1, T2 >& toCompare) const noexcept;
1748 
1750  // ============================================================================
1752  // ============================================================================
1754 
1761  const T1& first() const;
1762 
1769  const T2& second() const;
1770 
1772 
1773  private:
1775  using HashTable12 = typename std::conditional<
1776  std::is_scalar< T1 >::value && std::is_scalar< T2 >::value,
1777  HashTable< T1, T2, std::allocator< std::pair< T1, T2 > > >,
1778  HashTable< T1, T2*, std::allocator< std::pair< T1, T2* > > > >::type;
1780 
1782  HashIter __iter;
1783  };
1784 
1804  template < typename T1, typename T2, typename Alloc = std::allocator< T2 > >
1806  : public BijectionImplementation< T1,
1807  T2,
1808  Alloc,
1809  std::is_scalar< T1 >::value
1810  && std::is_scalar< T2 >::value > {
1811  public:
1814  using type1_type = T1;
1815  using type1_reference = T1&;
1816  using type1_const_reference = const T1&;
1817  using type1_pointer = T1*;
1818  using type1_const_pointer = const T1*;
1819  using type2_type = T2;
1820  using type2_reference = T2&;
1821  using type2_const_reference = const T2&;
1822  using type2_pointer = T2*;
1823  using type2_const_pointer = const T2*;
1824  using size_type = std::size_t;
1825  using difference_type = std::ptrdiff_t;
1826  using allocator_type = Alloc;
1828  using const_iterator = BijectionIterator< T1, T2 >;
1830  using const_iterator_safe = BijectionIteratorSafe< T1, T2 >;
1831 
1832  using allocator1_type = typename Alloc::template rebind< T1* >::other;
1833  using allocator2_type = typename Alloc::template rebind< T2* >::other;
1835 
1837  using Implementation =
1838  BijectionImplementation< T1,
1839  T2,
1840  Alloc,
1841  std::is_scalar< T1 >::value
1842  && std::is_scalar< T2 >::value >;
1843 
1844  // ============================================================================
1846  // ============================================================================
1848 
1857  bool resize_policy = HashTableConst::default_resize_policy);
1858 
1863  Bijection(std::initializer_list< std::pair< T1, T2 > > list);
1864 
1869  Bijection(const Bijection< T1, T2, Alloc >& toCopy);
1870 
1876  template < typename OtherAlloc >
1878 
1883  Bijection(Bijection< T1, T2, Alloc >&& from) noexcept;
1884 
1888  ~Bijection();
1889 
1891  // ============================================================================
1893  // ============================================================================
1895 
1902  operator=(const Bijection< T1, T2, Alloc >& toCopy);
1903 
1909  template < typename OtherAlloc >
1912 
1918 
1920  };
1921 
1931  template < typename T1, typename T2, typename Alloc >
1932  std::ostream& operator<<(std::ostream&,
1933  const Bijection< T1, T2, Alloc >& bijection);
1934 
1935 } /* namespace gum */
1936 
1937 
1938 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
1939 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
1940 extern template class gum::Bijection< int, int >;
1941 # endif
1942 #endif
1943 #ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
1944 # ifndef GUM_NO_EXTERN_TEMPLATE_CLASS
1945 extern template class gum::Bijection< std::string, std::string >;
1946 # endif
1947 #endif
1948 
1949 
1950 // always include the template implementations
1951 #include <agrum/core/bijection_tpl.h>
1952 
1953 #endif /* GUM_BIJECTION_H */
void insert(const T1 &first, const T2 &second)
Inserts a new association in the gum::Bijection.
friend class BijectionImplementation
a friend to speed-up accesses
Definition: bijection.h:651
const T2 & second(const T1 &first) const
Returns the second value of a pair given its first value.
void __copy(const HashTable< T1, T2 *, OtherAlloc > &source)
A function that performs a complete copy of another gum::Bijection.
void emplace(Args &&... args)
Emplace a new element in the gum::Bijection.
void clear()
Removes all the associations from the gum::Bijection.
BijectionImplementation< T1, T2, Alloc, Gen > & operator=(const BijectionImplementation< T1, T2, Alloc, Gen > &toCopy)
Copy operator.
Dummy classes for discriminating scalars and non-scalars operators and -> wihtout any overhead...
Definition: bijection.h:1363
const T1 & first(const T2 &second) const
Returns the first value of a pair given its second value.
std::forward_iterator_tag iterator_category
types for STL compliance
Definition: bijection.h:1418
void eraseFirst(const T1 &first)
Erases an association containing the given first element.
Safe iterators for bijectionIterator.
Definition: bijection.h:1411
iterator begin() const
Returns the unsafe iterator at the beginning of the gum::Bijection.
typename std::allocator< const std::string *> ::template rebind< std::pair< Idx, const std::string * * > >::other allocator12_type
Definition: bijection.h:107
STL namespace.
static constexpr Size default_size
The default number of slots in hashtables.
Definition: hashTable.h:80
typename std::conditional< std::is_scalar< int >::value &&std::is_scalar< int >::value, HashTable< int, int, std::allocator< std::pair< int, int > > >, HashTable< int, int *, std::allocator< std::pair< int, int * > > > >::type HashTable12
Alias for one of the internal gum::HashTable of the gum::Bijection.
Definition: bijection.h:1778
const_iterator cbegin() const
Returns the constant unsafe iterator at the beginning of the gum::Bjection.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Definition: agrum.h:25
static const iterator_safe & endSafe4Statics()
Returns the safe end iterator for other classes&#39; statics.
Definition: bijection_tpl.h:42
void resize(Size new_size)
Manually resize the gum::Bijection.
const const_iterator_safe & cendSafe() const noexcept
Returns the constant safe iterator at the end of the gum::Bijection.
bool existsSecond(const T2 &second) const
Returns true if second is the second element in a pair in the gum::Bijection.
static INLINE const T & op_second(const T *x)
Returns a refeence over a pointer.
Definition: bijection.h:1370
void eraseSecond(const T2 &second)
Erases an association containing the given second element.
BijectionIteratorSafe< T1, T2 > const_iterator_safe
types for STL compliance
Definition: bijection.h:105
Size capacity() const noexcept
Returns the number of hashtables slots used.
bool existsFirst(const T1 &first) const
Returns true if first is the first element in a pair in the gum::Bijection.
A class which creates the static iterator used by gim::Bijections.
Definition: bijection.h:1327
const iterator & end() const noexcept
Returns the unsafe iterator at the end of the gum::Bijection.
std::ostream & operator<<(std::ostream &output, const BayesNet< GUM_SCALAR > &bn)
Prints map&#39;s DAG in output using the Graphviz-dot format.
Definition: BayesNet_tpl.h:605
const T1 & firstWithDefault(const T2 &second, const T1 &default_val) const
Returns the first value of a pair given its second value or default_val if second is unfound...
bool empty() const noexcept
Returns true if the gum::Bijection doesn&#39;t contain any association.
const T2 & secondWithDefault(const T1 &second, const T2 &default_val) const
Returns the second value of a pair given its first value or default_val if first is unfound...
HashTable12 __firstToSecond
The gum::HashTable associating T2 objects to T1 objects.
Definition: bijection.h:660
Unsafe iterators for bijection.
Definition: bijection.h:1609
static constexpr bool default_resize_policy
A Boolean indicating whether inserting too many values into the hashtable makes it resize itself auto...
Definition: hashTable.h:94
typename std::allocator< std::size_t > ::template rebind< std::size_t * >::other allocator2_type
Definition: bijection.h:1833
Set of pairs of elements with fast search for both elements.
Definition: bijection.h:1805
typename std::allocator< std::size_t > ::template rebind< NodeId * >::other allocator1_type
Definition: bijection.h:1832
const const_iterator & cend() const noexcept
Returns the constant iterator at the end of the gum::Bijection.
static const BijectionIterator< int, int > * __BijectionIterEnd
The unsafe iterator used by everyone.
Definition: bijection.h:1337
Size size() const noexcept
Returns the number of associations stored within the gum::Bijection.
iterator_safe beginSafe() const
Returns the safe iterator at the beginning of the gum::Bijection.
~BijectionImplementation()
Destructor.
typename HashTable12::const_iterator HashIter
Definition: bijection.h:1779
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
typename std::conditional< std::is_scalar< NodeId >::value &&std::is_scalar< GUM_SCALAR >::value, HashTable< NodeId, GUM_SCALAR, std::allocator< std::pair< NodeId, GUM_SCALAR > > >, HashTable< NodeId, GUM_SCALAR *, std::allocator< std::pair< NodeId, GUM_SCALAR * > > > >::type HashTable12
Alias for one of the internal gum::HashTable of the gum::Bijection.
Definition: bijection.h:1586
static INLINE const T & op_second(const T &x)
Returns a reference.
Definition: bijection.h:1392
BijectionIterator< T1, T2 > const_iterator
types for STL compliance
Definition: bijection.h:103
static const BijectionIteratorSafe< int, int > * __BijectionIterEndSafe
The safe iterator used by everyone.
Definition: bijection.h:1334
std::string toString() const
Returns a friendly representatin of the gum::Bijection.
bool resizePolicy() const noexcept
Returns true if the resize policy is automatic.
const iterator_safe & endSafe() const noexcept
Returns the safe iterator at the end of the gum::Bijection.
typename HashTable12::const_iterator_safe HashIter
Alias for one of the internal gum::HastTableIterator of the gum::Bijection.
Definition: bijection.h:1590
std::forward_iterator_tag iterator_category
types for STL compliance
Definition: bijection.h:1616
typename std::allocator< const std::string *> ::template rebind< std::pair< const std::string *, Idx * > >::other allocator21_type
Definition: bijection.h:109
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48
static const iterator & end4Statics()
Returns the unsafe end iterator for other classes&#39; statics.
Definition: bijection_tpl.h:50
HashTable21 __secondToFirst
The gum::HashTable associating T1 objects to T2 objects.
Definition: bijection.h:663
const_iterator_safe cbeginSafe() const
Returns the constant safe iterator at the begining of the gum::Bijection.
HashTable12::value_type * __insert(const T1 &first, const T2 &second)
Inserts a new association into the gum::Bijection.
void setResizePolicy(const bool new_policy) noexcept
Change the gum::Bijection resizing policy.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
A non scalar implementation of a Bijection.
Definition: bijection.h:85