Files CCore/inc/CompactMap.h CCore/src/CompactMap.cpp
These two classes are compact variants of the traditional maps. They have the same set of methods and behavior, except compact maps move elements during delete operations. Compact maps are more efficient and consume less memory, than traditional. They require the object type to be swappable. They also have no node allocator template parameter: compact node allocator is always used. Constructor arguments are forwarded to the allocator.
This map is a variant of the RBTreeMap.
template <class K,class T,class KRef=K>
class CompactRBTreeMap : NoCopy
{
....
public:
// constructors
template <class ... SS>
explicit CompactRBTreeMap(SS && ... ss) noexcept;
~CompactRBTreeMap();
// std move
CompactRBTreeMap(CompactRBTreeMap &&obj) noexcept;
CompactRBTreeMap & operator = (CompactRBTreeMap &&obj) noexcept;
// props
ulen operator + () const;
bool operator ! () const;
ulen getCount() const;
// find
T * find(KRef key);
T * findMin();
T * findMin(KRef key);
T * findMax();
T * findMax(KRef key);
const T * find(KRef key) const;
const T * findMin() const;
const T * findMin(KRef key) const;
const T * findMax() const;
const T * findMax(KRef key) const;
const T * find_const(KRef key) const;
const T * findMin_const() const;
const T * findMin_const(KRef key) const;
const T * findMax_const() const;
const T * findMax_const(KRef key) const;
template <class S>
struct NodePtr
{
....
// object ptr
Node * operator + () const;
bool operator ! () const;
S * getPtr() const;
S & operator * () const;
S * operator -> () const;
const K & getKey() const;
};
NodePtr<T> find_ptr(KRef key);
NodePtr<T> findMin_ptr();
NodePtr<T> findMin_ptr(KRef key);
NodePtr<T> findMax_ptr();
NodePtr<T> findMax_ptr(KRef key);
NodePtr<const T> find_ptr(KRef key) const;
NodePtr<const T> findMin_ptr() const;
NodePtr<const T> findMin_ptr(KRef key) const;
NodePtr<const T> findMax_ptr() const;
NodePtr<const T> findMax_ptr(KRef key) const;
NodePtr<const T> find_ptr_const(KRef key) const;
NodePtr<const T> findMin_ptr_const() const;
NodePtr<const T> findMin_ptr_const(KRef key) const;
NodePtr<const T> findMax_ptr_const() const;
NodePtr<const T> findMax_ptr_const(KRef key) const;
// add/del
struct Result
{
T *obj;
bool new_flag;
Result(T *obj_,bool new_flag_) : obj(obj_),new_flag(new_flag_) {}
operator T * () const { return obj; }
};
template <class ... SS>
Result find_or_add(KRef key,SS && ... ss);
bool del(KRef key);
bool delMin();
bool delMax();
template <class S>
bool del(NodePtr<S> node_ptr);
ulen erase();
// apply
template <class FuncInit>
void applyIncr(FuncInit func_init);
template <class FuncInit>
void applyDecr(FuncInit func_init);
template <class FuncInit>
void applyIncr(FuncInit func_init) const;
template <class FuncInit>
void applyDecr(FuncInit func_init) const;
template <class FuncInit>
void applyIncr_const(FuncInit func_init) const;
template <class FuncInit>
void applyDecr_const(FuncInit func_init) const;
// swap/move objects
void objSwap(CompactRBTreeMap<K,T,KRef> &obj);
explicit CompactRBTreeMap(ToMoveCtor<CompactRBTreeMap<K,T,KRef> > obj);
};
This map is a variant of the RadixTreeMap.
template <class K,class T>
class CompactRadixTreeMap : NoCopy
{
....
public:
// constructors
template <class ... SS>
explicit CompactRadixTreeMap(SS && ... ss) noexcept;
template <class ... SS>
explicit CompactRadixTreeMap(KeyRange<K> key_range,SS && ... ss) noexcept;
~CompactRadixTreeMap();
// std move
CompactRadixTreeMap(CompactRadixTreeMap &&obj) noexcept;
CompactRadixTreeMap & operator = (CompactRadixTreeMap &&obj) noexcept;
// props
ulen operator + () const;
bool operator ! () const;
ulen getCount() const;
// find
T * find(K key);
T * findMin();
T * findMin(K key);
T * findMax();
T * findMax(K key);
const T * find(K key) const;
const T * findMin() const;
const T * findMin(K key) const;
const T * findMax() const;
const T * findMax(K key) const;
const T * find_const(K key) const;
const T * findMin_const() const;
const T * findMin_const(K key) const;
const T * findMax_const() const;
const T * findMax_const(K key) const;
template <class S>
struct NodePtr
{
....
// object ptr
Node * operator + () const;
bool operator ! () const;
S * getPtr() const;
S & operator * () const;
S * operator -> () const;
K getKey() const;
};
NodePtr<T> find_ptr(K key);
NodePtr<T> findMin_ptr();
NodePtr<T> findMin_ptr(K key);
NodePtr<T> findMax_ptr();
NodePtr<T> findMax_ptr(K key);
NodePtr<const T> find_ptr(K key) const;
NodePtr<const T> findMin_ptr() const;
NodePtr<const T> findMin_ptr(K key) const;
NodePtr<const T> findMax_ptr() const;
NodePtr<const T> findMax_ptr(K key) const;
NodePtr<const T> find_ptr_const(K key) const;
NodePtr<const T> findMin_ptr_const() const;
NodePtr<const T> findMin_ptr_const(K key) const;
NodePtr<const T> findMax_ptr_const() const;
NodePtr<const T> findMax_ptr_const(K key) const;
// add/del
struct Result
{
T *obj;
bool new_flag;
Result(T *obj_,bool new_flag_) : obj(obj_),new_flag(new_flag_) {}
operator T * () const { return obj; }
};
template <class ... SS>
Result find_or_add(K key,SS && ... ss);
bool del(K key);
bool delMin();
bool delMax();
template <class S>
bool del(NodePtr<S> node_ptr);
ulen erase();
// apply
template <class FuncInit>
void applyIncr(FuncInit func_init);
template <class FuncInit>
void applyDecr(FuncInit func_init);
template <class FuncInit>
void applyIncr(FuncInit func_init) const;
template <class FuncInit>
void applyDecr(FuncInit func_init) const;
template <class FuncInit>
void applyIncr_const(FuncInit func_init) const;
template <class FuncInit>
void applyDecr_const(FuncInit func_init) const;
// swap/move objects
void objSwap(CompactRadixTreeMap<K,T> &obj);
explicit CompactRadixTreeMap(ToMoveCtor<CompactRadixTreeMap<K,T> > obj);
};