#ifndef FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_ #define FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_ template inline FixedOrderedMultimap::Iterator::Iterator(): ArrayList, uint32_t>::Iterator(){} template inline FixedOrderedMultimap::Iterator::Iterator( std::pair *pair): ArrayList, uint32_t>::Iterator(pair){} template inline typename FixedOrderedMultimap::Iterator FixedOrderedMultimap::begin() const { return Iterator(&theMap[0]); } template inline typename FixedOrderedMultimap::Iterator FixedOrderedMultimap::end() const { return Iterator(&theMap[_size]); } template inline size_t FixedOrderedMultimap::size() const { return _size; } template inline FixedOrderedMultimap::FixedOrderedMultimap( size_t maxSize): theMap(maxSize), _size(0) {} template inline ReturnValue_t FixedOrderedMultimap::insert( key_t key, T value, Iterator *storedValue) { if (_size == theMap.maxSize()) { return MAP_FULL; } uint32_t position = findNicePlace(key); // Compiler might emitt warning because std::pair is not a POD type (yet..) // See: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2342.htm#std::pair-example // Circumvent warning by casting to void* std::memmove(static_cast(&theMap[position + 1]), static_cast(&theMap[position]), (_size - position) * sizeof(std::pair)); theMap[position].first = key; theMap[position].second = value; ++_size; if (storedValue != nullptr) { *storedValue = Iterator(&theMap[position]); } return HasReturnvaluesIF::RETURN_OK; } template inline ReturnValue_t FixedOrderedMultimap::insert( std::pair pair) { return insert(pair.fist, pair.second); } template inline ReturnValue_t FixedOrderedMultimap::exists( key_t key) const { ReturnValue_t result = KEY_DOES_NOT_EXIST; if (findFirstIndex(key) < _size) { result = HasReturnvaluesIF::RETURN_OK; } return result; } template inline ReturnValue_t FixedOrderedMultimap::erase( Iterator *iter) { uint32_t i; if ((i = findFirstIndex((*iter).value->first)) >= _size) { return KEY_DOES_NOT_EXIST; } removeFromPosition(i); if (*iter != begin()) { (*iter)--; } else { *iter = begin(); } return HasReturnvaluesIF::RETURN_OK; } template inline ReturnValue_t FixedOrderedMultimap::erase( key_t key) { uint32_t i; if ((i = findFirstIndex(key)) >= _size) { return KEY_DOES_NOT_EXIST; } do { removeFromPosition(i); i = findFirstIndex(key, i); } while (i < _size); return HasReturnvaluesIF::RETURN_OK; } template inline ReturnValue_t FixedOrderedMultimap::find( key_t key, T **value) const { ReturnValue_t result = exists(key); if (result != HasReturnvaluesIF::RETURN_OK) { return result; } *value = &theMap[findFirstIndex(key)].second; return HasReturnvaluesIF::RETURN_OK; } template inline typename FixedOrderedMultimap::Iterator FixedOrderedMultimap::find( key_t key) const { ReturnValue_t result = exists(key); if (result != HasReturnvaluesIF::RETURN_OK) { return end(); } return Iterator(&theMap[findFirstIndex(key)]); } template inline void FixedOrderedMultimap::clear() { _size = 0; } template inline size_t FixedOrderedMultimap::maxSize() const { return theMap.maxSize(); } #endif /* FRAMEWORK_CONTAINER_FIXEDORDEREDMULTIMAP_TPP_ */