QxOrm
1.5.0
C++ Object Relational Mapping library
|
qx::QxCollection<Key, Value> : QxOrm thread-safe container (keep insertion order + quick access by index + quick access by key) More...
#include <QxCollection.h>
Classes | |
struct | compareKeyValue |
struct | compareKeyValue< true, dummy > |
Public Types | |
typedef QPair< Key, Value > | type_pair_key_value |
typedef type_list_pair_key_value::iterator | iterator |
typedef type_list_pair_key_value::const_iterator | const_iterator |
typedef type_list_pair_key_value::reverse_iterator | reverse_iterator |
typedef type_list_pair_key_value::const_reverse_iterator | const_reverse_iterator |
typedef const Key & | const_reference_key |
typedef const Value & | const_reference_value |
Public Member Functions | |
QxCollection () | |
Construct an empty list. | |
QxCollection (const QxCollection< Key, Value > &other) | |
Construct a copy of 'other'. | |
virtual | ~QxCollection () |
Destroy the list. | |
QxCollection< Key, Value > & | operator= (const QxCollection< Key, Value > &other) |
Assign 'other' to this list and return a reference to this list. | |
bool | operator== (const QxCollection< Key, Value > &other) const |
Return 'true' if 'other' is equal to this list, otherwise return 'false' (same values in the same order) | |
bool | operator!= (const QxCollection< Key, Value > &other) const |
Return 'true' if 'other' is not equal to this list, otherwise return 'false'. | |
iterator | begin () |
Return an STL-style iterator pointing to the first item in the list. | |
iterator | end () |
Return an STL-style iterator pointing to the imaginary item after the last item in the list. | |
const_iterator | begin () const |
Return a const STL-style iterator pointing to the first item in the list. | |
const_iterator | end () const |
Return a const STL-style iterator pointing to the imaginary item after the last item in the list. | |
reverse_iterator | rbegin () |
Return a reverse STL-style iterator pointing to the first item in the list. | |
reverse_iterator | rend () |
Return a reverse STL-style iterator pointing to the imaginary item after the last item in the list. | |
const_reverse_iterator | rbegin () const |
Return a const reverse STL-style iterator pointing to the first item in the list. | |
const_reverse_iterator | rend () const |
Return a const reverse STL-style iterator pointing to the imaginary item after the last item in the list. | |
void | reserve (long size) |
Request that the capacity of the allocated storage space for the items of the container be at least enough to hold 'size' elements. | |
void | reverse () |
Reverse all items in the list. | |
void | clear () |
Remove all items from the list. | |
long | count () const |
Return the number of items in the list (same as 'size()') | |
long | size () const |
Return the number of items in the list (same as 'count()') | |
bool | contains (const Key &key) const |
Return 'true' if the list contains an occurrence of 'key', otherwise return 'false' (same as 'exist()') | |
bool | exist (const Key &key) const |
Return 'true' if the list contains an occurrence of 'key', otherwise return 'false' (same as 'contains()') | |
bool | empty () const |
Return 'true' if the list contains no items; otherwise return 'false'. | |
bool | push_back (const Key &key, const Value &value) |
Add element 'value' at the end of the list indexed by 'key'. | |
bool | push_front (const Key &key, const Value &value) |
Insert 'value' at the beginning of the list indexed by 'key'. | |
bool | insert (const Key &key, const Value &value) |
Add element 'value' at the end of the list indexed by 'key'. | |
bool | insert (long index, const Key &key, const Value &value) |
Insert element 'value' at position 'index' in the list indexed by 'key'. | |
bool | insert (const QxCollection< Key, Value > &other) |
Add all items of 'other' at the end of the list. | |
bool | insert (long index, const QxCollection< Key, Value > &other) |
Insert all items of 'other' at the end of the list. | |
bool | replace (long index, const Key &key, const Value &value) |
Replace the item at index position 'index' with element 'value' indexed by 'key'. | |
bool | swap (long index1, long index2) |
Exchange the item at index position 'index1' with the item at index position 'index2'. | |
bool | move (long indexFrom, long indexTo) |
Move the item at index position 'indexFrom' to index position 'indexTo'. | |
bool | removeByKey (const Key &key) |
Remove the item indexed by 'key' in the list. | |
bool | removeByIndex (long index) |
Remove the item at index position 'index'. | |
bool | removeByIndex (long first, long last) |
Remove all items from index position 'first' to index position 'last'. | |
bool | removeFirst () |
Remove the first item in the list. | |
bool | removeLast () |
Remove the last item in the list. | |
const_reference_value | getByKey (const Key &key) const |
Return the item associated with the 'key'. | |
const_reference_value | getByIndex (long index) const |
Return the item at index position 'index'. | |
const_reference_value | getFirst () const |
Return the first element in the list. | |
const_reference_value | getLast () const |
Return the last element in the list. | |
const_reference_key | getKeyByIndex (long index) const |
Return the key associated with the element at index position 'index'. | |
void | sortByKey (bool bAscending=true) |
Sort all items in the list using associated keys to compare. | |
void | sortByValue (bool bAscending=true) |
Sort all items in the list. | |
template<typename Compare > | |
void | sort (Compare comp) |
virtual long | _count () const |
virtual void | _clear () |
virtual bool | _remove (long index) |
virtual qx::any | _at (long index) const |
Protected Types | |
typedef QList < type_pair_key_value > | type_list_pair_key_value |
typedef QHash< Key, long > | type_hash_position |
Protected Member Functions | |
void | cloneCollection (QxCollection< Key, Value > *pClone, const QxCollection< Key, Value > &pRef) |
bool | isSameCollection (const QxCollection< Key, Value > *p1, const QxCollection< Key, Value > &p2) const |
void | updateHashPosition (long from=0, long to=-1, bool check=false) |
Protected Attributes | |
QMutex | m_mutex |
Mutex => qx::QxCollection is thread-safe. | |
type_list_pair_key_value | m_list |
Container to keep insertion order. | |
type_hash_position | m_hash |
Container for fast search by key. | |
bool | m_batch |
Batch mode to sync internal containers. |
qx::QxCollection<Key, Value> : QxOrm thread-safe container (keep insertion order + quick access by index + quick access by key)
Based on boost::multi_index_container, this collection has advantages of std::vector<T> (keep insertion order + quick access by index) and boost::unordered_map<Key, Value> or QHash<Key, Value> (quick access by key : hash-map).
Note : qx::QxCollection<Key, Value> is compatible with the foreach macro provided by Qt library and the BOOST_FOREACH macro provided by boost library. However, each element returned by these 2 macros corresponds to an object of type std::pair<Key, Value>. To obtain a more natural and more readable result, it is advised to use the _foreach macro : this macro uses BOOST_FOREACH for all the containers except for qx::QxCollection<Key, Value>. In this case, the returned element corresponds to the Value type (cf. following sample). The macro _foreach is compatible with all containers (stl, Qt, boost...) since it uses the macro BOOST_FOREACH.
Additional note : qx::QxCollection<Key, Value> is particularly suited to receive data resulting from a database. Indeed, these data can be sorted (by using ORDER BY in a SQL request for example), it is thus important to preserve the insertion order of the elements in the list. Furthermore, each data resulting from a database has a unique id. It is thus important to be able to access quickly to an element based on this single identifier (hash-map).
Quick sample using qx::QxCollection<Key, Value> container :
// definition of drug class with 3 properties : 'code', 'name' and 'description' class drug { public: QString code; QString name; QString desc; }; // typedef a smart-pointer of drug class typedef std::shared_ptr<drug> drug_ptr; // collection of drugs indexed by 'code' property (QString type) qx::QxCollection<QString, drug_ptr> lstDrugs; // create 3 new drugs drug_ptr d1; d1.reset(new drug()); d1->code = "code1"; d1->name = "name1"; d1->desc = "desc1"; drug_ptr d2; d2.reset(new drug()); d2->code = "code2"; d2->name = "name2"; d2->desc = "desc2"; drug_ptr d3; d3.reset(new drug()); d3->code = "code3"; d3->name = "name3"; d3->desc = "desc3"; // insert 3 drugs into the collection lstDrugs.insert(d1->code, d1); lstDrugs.insert(d2->code, d2); lstDrugs.insert(d3->code, d3); // iterate over drugs container using QxOrm '_foreach' keyword _foreach(drug_ptr p, lstDrugs) { qDebug() << qPrintable(p->name) << " " << qPrintable(p->desc); } // iterate over drugs container using classic C++ 'for' keyword for (long l = 0; l < lstDrugs.count(); ++l) { drug_ptr p = lstDrugs.getByIndex(l); QString code = lstDrugs.getKeyByIndex(l); qDebug() << qPrintable(p->name) << " " << qPrintable(p->desc); } // iterate over drugs container using 'qx::QxCollectionIterator' Java-style iterator qx::QxCollectionIterator<QString, drug_ptr> itr(lstDrugs); while (itr.next()) { QString code = itr.key(); qDebug() << qPrintable(itr.value()->name) << " " << qPrintable(itr.value()->desc); } // sort drugs container ascending by key and sort descending by value lstDrugs.sortByKey(true); lstDrugs.sortByValue(false); // access to a drug into the collection by its 'code' property drug_ptr p = lstDrugs.getByKey("code2"); // access to a drug into the collection by index (position in the list) drug_ptr p = lstDrugs.getByIndex(2); // test if a drug exists into the collection and if the collection is empty bool bExist = lstDrugs.exist("code3"); bool bEmpty = lstDrugs.empty(); // remove the second drug from the collection lstDrugs.removeByIndex(2); // remove a drug from the collection using its 'code' property lstDrugs.removeByKey("code3"); // clear the collection : remove all items from the list lstDrugs.clear();
Definition at line 147 of file QxCollection.h.
typedef type_list_pair_key_value::const_iterator qx::QxCollection< Key, Value >::const_iterator |
Definition at line 162 of file QxCollection.h.
typedef const Key& qx::QxCollection< Key, Value >::const_reference_key |
Definition at line 169 of file QxCollection.h.
typedef const Value& qx::QxCollection< Key, Value >::const_reference_value |
Definition at line 170 of file QxCollection.h.
typedef type_list_pair_key_value::const_reverse_iterator qx::QxCollection< Key, Value >::const_reverse_iterator |
Definition at line 166 of file QxCollection.h.
typedef type_list_pair_key_value::iterator qx::QxCollection< Key, Value >::iterator |
Definition at line 161 of file QxCollection.h.
typedef type_list_pair_key_value::reverse_iterator qx::QxCollection< Key, Value >::reverse_iterator |
Definition at line 165 of file QxCollection.h.
typedef QHash<Key, long> qx::QxCollection< Key, Value >::type_hash_position [protected] |
Definition at line 157 of file QxCollection.h.
typedef QList<type_pair_key_value> qx::QxCollection< Key, Value >::type_list_pair_key_value [protected] |
Definition at line 156 of file QxCollection.h.
typedef QPair<Key, Value> qx::QxCollection< Key, Value >::type_pair_key_value |
Definition at line 152 of file QxCollection.h.
qx::QxCollection< Key, Value >::QxCollection | ( | ) |
Construct an empty list.
qx::QxCollection< Key, Value >::QxCollection | ( | const QxCollection< Key, Value > & | other | ) |
Construct a copy of 'other'.
virtual qx::QxCollection< Key, Value >::~QxCollection | ( | ) | [virtual] |
Destroy the list.
virtual qx::any qx::QxCollection< Key, Value >::_at | ( | long | index | ) | const [inline, virtual] |
Implements qx::IxCollection.
Definition at line 267 of file QxCollection.h.
virtual void qx::QxCollection< Key, Value >::_clear | ( | ) | [inline, virtual] |
Implements qx::IxCollection.
Definition at line 265 of file QxCollection.h.
virtual long qx::QxCollection< Key, Value >::_count | ( | ) | const [inline, virtual] |
Implements qx::IxCollection.
Definition at line 264 of file QxCollection.h.
virtual bool qx::QxCollection< Key, Value >::_remove | ( | long | index | ) | [inline, virtual] |
Implements qx::IxCollection.
Definition at line 266 of file QxCollection.h.
iterator qx::QxCollection< Key, Value >::begin | ( | ) |
Return an STL-style iterator pointing to the first item in the list.
const_iterator qx::QxCollection< Key, Value >::begin | ( | ) | const |
Return a const STL-style iterator pointing to the first item in the list.
void qx::QxCollection< Key, Value >::clear | ( | ) |
Remove all items from the list.
void qx::QxCollection< Key, Value >::cloneCollection | ( | QxCollection< Key, Value > * | pClone, |
const QxCollection< Key, Value > & | pRef | ||
) | [protected] |
bool qx::QxCollection< Key, Value >::contains | ( | const Key & | key | ) | const |
Return 'true' if the list contains an occurrence of 'key', otherwise return 'false' (same as 'exist()')
long qx::QxCollection< Key, Value >::count | ( | ) | const |
Return the number of items in the list (same as 'size()')
bool qx::QxCollection< Key, Value >::empty | ( | ) | const |
Return 'true' if the list contains no items; otherwise return 'false'.
iterator qx::QxCollection< Key, Value >::end | ( | ) |
Return an STL-style iterator pointing to the imaginary item after the last item in the list.
const_iterator qx::QxCollection< Key, Value >::end | ( | ) | const |
Return a const STL-style iterator pointing to the imaginary item after the last item in the list.
bool qx::QxCollection< Key, Value >::exist | ( | const Key & | key | ) | const |
Return 'true' if the list contains an occurrence of 'key', otherwise return 'false' (same as 'contains()')
const_reference_value qx::QxCollection< Key, Value >::getByIndex | ( | long | index | ) | const |
Return the item at index position 'index'.
const_reference_value qx::QxCollection< Key, Value >::getByKey | ( | const Key & | key | ) | const |
Return the item associated with the 'key'.
const_reference_value qx::QxCollection< Key, Value >::getFirst | ( | ) | const |
Return the first element in the list.
const_reference_key qx::QxCollection< Key, Value >::getKeyByIndex | ( | long | index | ) | const |
Return the key associated with the element at index position 'index'.
const_reference_value qx::QxCollection< Key, Value >::getLast | ( | ) | const |
Return the last element in the list.
bool qx::QxCollection< Key, Value >::insert | ( | const Key & | key, |
const Value & | value | ||
) |
Add element 'value' at the end of the list indexed by 'key'.
bool qx::QxCollection< Key, Value >::insert | ( | long | index, |
const Key & | key, | ||
const Value & | value | ||
) |
Insert element 'value' at position 'index' in the list indexed by 'key'.
bool qx::QxCollection< Key, Value >::insert | ( | const QxCollection< Key, Value > & | other | ) |
Add all items of 'other' at the end of the list.
bool qx::QxCollection< Key, Value >::insert | ( | long | index, |
const QxCollection< Key, Value > & | other | ||
) |
Insert all items of 'other' at the end of the list.
bool qx::QxCollection< Key, Value >::isSameCollection | ( | const QxCollection< Key, Value > * | p1, |
const QxCollection< Key, Value > & | p2 | ||
) | const [protected] |
bool qx::QxCollection< Key, Value >::move | ( | long | indexFrom, |
long | indexTo | ||
) |
Move the item at index position 'indexFrom' to index position 'indexTo'.
bool qx::QxCollection< Key, Value >::operator!= | ( | const QxCollection< Key, Value > & | other | ) | const |
Return 'true' if 'other' is not equal to this list, otherwise return 'false'.
QxCollection<Key, Value>& qx::QxCollection< Key, Value >::operator= | ( | const QxCollection< Key, Value > & | other | ) |
Assign 'other' to this list and return a reference to this list.
bool qx::QxCollection< Key, Value >::operator== | ( | const QxCollection< Key, Value > & | other | ) | const |
Return 'true' if 'other' is equal to this list, otherwise return 'false' (same values in the same order)
bool qx::QxCollection< Key, Value >::push_back | ( | const Key & | key, |
const Value & | value | ||
) |
Add element 'value' at the end of the list indexed by 'key'.
bool qx::QxCollection< Key, Value >::push_front | ( | const Key & | key, |
const Value & | value | ||
) |
Insert 'value' at the beginning of the list indexed by 'key'.
reverse_iterator qx::QxCollection< Key, Value >::rbegin | ( | ) |
Return a reverse STL-style iterator pointing to the first item in the list.
const_reverse_iterator qx::QxCollection< Key, Value >::rbegin | ( | ) | const |
Return a const reverse STL-style iterator pointing to the first item in the list.
bool qx::QxCollection< Key, Value >::removeByIndex | ( | long | index | ) |
Remove the item at index position 'index'.
bool qx::QxCollection< Key, Value >::removeByIndex | ( | long | first, |
long | last | ||
) |
Remove all items from index position 'first' to index position 'last'.
bool qx::QxCollection< Key, Value >::removeByKey | ( | const Key & | key | ) |
Remove the item indexed by 'key' in the list.
bool qx::QxCollection< Key, Value >::removeFirst | ( | ) |
Remove the first item in the list.
bool qx::QxCollection< Key, Value >::removeLast | ( | ) |
Remove the last item in the list.
reverse_iterator qx::QxCollection< Key, Value >::rend | ( | ) |
Return a reverse STL-style iterator pointing to the imaginary item after the last item in the list.
const_reverse_iterator qx::QxCollection< Key, Value >::rend | ( | ) | const |
Return a const reverse STL-style iterator pointing to the imaginary item after the last item in the list.
bool qx::QxCollection< Key, Value >::replace | ( | long | index, |
const Key & | key, | ||
const Value & | value | ||
) |
Replace the item at index position 'index' with element 'value' indexed by 'key'.
void qx::QxCollection< Key, Value >::reserve | ( | long | size | ) |
Request that the capacity of the allocated storage space for the items of the container be at least enough to hold 'size' elements.
void qx::QxCollection< Key, Value >::reverse | ( | ) |
Reverse all items in the list.
long qx::QxCollection< Key, Value >::size | ( | ) | const |
Return the number of items in the list (same as 'count()')
void qx::QxCollection< Key, Value >::sort | ( | Compare | comp | ) | [inline] |
Definition at line 236 of file QxCollection.h.
void qx::QxCollection< Key, Value >::sortByKey | ( | bool | bAscending = true | ) |
Sort all items in the list using associated keys to compare.
void qx::QxCollection< Key, Value >::sortByValue | ( | bool | bAscending = true | ) |
Sort all items in the list.
bool qx::QxCollection< Key, Value >::swap | ( | long | index1, |
long | index2 | ||
) |
Exchange the item at index position 'index1' with the item at index position 'index2'.
void qx::QxCollection< Key, Value >::updateHashPosition | ( | long | from = 0 , |
long | to = -1 , |
||
bool | check = false |
||
) | [protected] |
bool qx::QxCollection< Key, Value >::m_batch [protected] |
Batch mode to sync internal containers.
Definition at line 177 of file QxCollection.h.
type_hash_position qx::QxCollection< Key, Value >::m_hash [protected] |
Container for fast search by key.
Definition at line 176 of file QxCollection.h.
type_list_pair_key_value qx::QxCollection< Key, Value >::m_list [protected] |
Container to keep insertion order.
Definition at line 175 of file QxCollection.h.
QMutex qx::QxCollection< Key, Value >::m_mutex [mutable, protected] |
Mutex => qx::QxCollection is thread-safe.
Definition at line 174 of file QxCollection.h.