4#include <system/collections/idictionary.h>
5#include <system/cycles_detection.h>
6#include <system/collections/base_enumerator.h>
7#include <system/details/hash_quality_checker.h>
8#include <system/collections/virtualized_iterator.h>
13namespace System {
namespace Collections {
namespace Generic {
17template <
typename Dict>
19 :
public System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>
20 ,
private System::Details::IteratorPointerUpdater<typename Dict::KeyValuePairType, false>
22 using System::Details::NativeIteratorWrapperBase<
typename Dict::KeyValuePairType,
typename Dict::map_t::const_iterator>::m_iterator;
23 using System::Details::NativeIteratorWrapperBase<
typename Dict::KeyValuePairType,
typename Dict::map_t::const_iterator>::m_end;
24 using System::Details::VirtualizedIteratorBase<
typename Dict::KeyValuePairType>::m_is_end;
25 using System::Details::VirtualizedIteratorBase<
typename Dict::KeyValuePairType>::m_pointer;
26 using System::Details::IteratorPointerUpdater<
typename Dict::KeyValuePairType,
false>::InitializeIteratorPointer;
27 using System::Details::IteratorPointerUpdater<
typename Dict::KeyValuePairType,
false>::UpdateIteratorPointer;
33 DictionaryIterator(
typename Dict::map_t::const_iterator &&iterator,
typename Dict::map_t::const_iterator &&end) noexcept
34 : System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>(
35 std::forward<typename Dict::map_t::const_iterator>(iterator),
36 std::forward<typename Dict::map_t::const_iterator>(end)
39 InitializeIteratorPointer(m_pointer);
41 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
46 DictionaryIterator(
const typename Dict::map_t::const_iterator &iterator,
const typename Dict::map_t::const_iterator &end)
47 :
System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>(iterator, end)
49 InitializeIteratorPointer(m_pointer);
51 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
56 : System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>(std::forward(other.m_iterator))
59 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
67 if (System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>::IteratorIncrementImplementation())
68 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
73 System::Details::IteratorDecrementer<typename Dict::map_t::const_iterator>::decrement(m_iterator);
74 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
80 if (System::Details::NativeIteratorWrapperBase<typename Dict::KeyValuePairType, typename Dict::map_t::const_iterator>::IteratorShiftImplementation(offset))
81 UpdateIteratorPointer(m_pointer,
typename Dict::KeyValuePairType(m_iterator->first, m_iterator->second));
85 System::Details::VirtualizedIteratorBase<typename Dict::KeyValuePairType>*
CloneIterator()
const override
101 ASPOSE_MAP_POINTER_MODE_CONTROL(Map)
106 static_assert(std::is_same<
decltype(m_map.get_allocator()),
typename pointer_mode_t::allocator_type>::value,
"Container's allocator is not set to typename pointer_mode_t::allocator_type");
107 m_pointer_mode.SetWeak(argument, m_map);
118 typedef typename Map::key_type key_t;
120 typedef typename Map::mapped_type mapped_t;
122 typedef typename Map::iterator mapIt_t;
124 typedef typename Map::const_iterator stl_const_iterator;
127 static_assert(std::is_same<allocator_t, typename Map::allocator_type>::value,
"Using wrong map type with BaseDictionary");
151 template<
class... Args>
153 : m_map(args..., ASPOSE_COLLECTION_ALLOCATOR)
160 template<
class... Args>
162 : m_map(args..., ASPOSE_COLLECTION_ALLOCATOR)
184 return static_cast<int32_t
>(m_map.size());
204 mapped_t
idx_get(
const key_t& key)
const override
207 auto it = m_map.find(key);
208 if (it == m_map.end())
210 throw KeyNotFoundException();
218 void idx_set(
const key_t& key, mapped_t value)
override
222#if defined(ASPOSE_DETECT_BAD_QUALITY_HASH)
223 System::Details::CheckHashFunctionQuality(m_map);
230 void Add(
const key_t& key,
const mapped_t& value)
override
234 auto op_result = m_map.insert(std::make_pair(key, value));
235 if (! op_result.second)
237 throw System::ArgumentException(u
"key");
239#if defined(ASPOSE_DETECT_BAD_QUALITY_HASH)
240 System::Details::CheckHashFunctionQuality(m_map);
249 return m_map.find(key) != m_map.end();
257 auto it = m_map.find(key);
259 if (it != m_map.end())
271 bool TryGetValue(
const key_t& key, mapped_t& value)
const override
273 auto it = m_map.find(key);
275 if (it != m_map.end())
293 for (
const auto& itr : m_map)
295 if (itr.second == value)
306 const Map&
data()
const {
return m_map; }
309 void _add_range(std::initializer_list<typename Map::value_type> list)
311 std::for_each(list.begin(), list.end(), [
this](
const typename Map::value_type &v) { m_map.insert(v); });
317 auto it = m_map.find(key);
319 if (it != m_map.end())
330 auto it = m_map.find(key);
332 if (it != m_map.end())
343 auto it = m_map.find(key);
345 if (it != m_map.end())
359 return m_map.begin();
374 stl_const_iterator
cbegin() const noexcept
376 return m_map.cbegin();
382 stl_const_iterator
cend() const noexcept
418 auto it = m_map.find(item.
m_pair.first);
420 return it != m_map.end() && it->second == item.
m_pair.second;
427 auto it = m_map.find(item.
m_pair.first);
429 if (it != m_map.end() && it->second == item.
m_pair.second)
438#ifdef ASPOSE_GET_SHARED_MEMBERS
441 virtual void GetSharedMembers(System::Object::shared_members_type& result)
const override
443 Object::GetSharedMembers(result);
444 result.PopulateSharedMembers(
"System::Collections::Generic::BaseDictionary<Map>::m_map[]", m_map);
451 void CopyFrom(BaseType* src)
454 throw ArgumentNullException(u
"Argument cannot be nullptr");
457 while (enumerator->MoveNext())
462 void Add(
const KeyValuePair<key_t, mapped_t>& item)
override
464 m_map.insert(item.m_pair);
467 static NotSupportedException ReadOnlyException()
469 return NotSupportedException(u
"The collection is readonly");
476#ifdef __DBG_FOR_EACH_MEMBER
480 void DBG_for_each_member(DBG::for_each_member_visitor &visitor)
const override
482 visitor.add_self(
this);
483 DBG::for_each_of_Object(
this, m_map, visitor);
488 const char* DBG_class_name()
const override {
return "BaseDictionary<T>"; }
495 template <
typename T,
class =
void>
496 struct has_equality_operator : std::false_type {};
500 template <
typename T>
501 struct has_equality_operator<T, typename std::enable_if<!std::is_enum<T>::value, decltype((void)(std::declval<T>() == nullptr))>::type> : std::true_type
507 template <
typename T>
508 typename std::enable_if<has_equality_operator<T>::value,
void>::type CheckIfNull(
const T& instance)
const
510 if (instance ==
nullptr)
512 throw System::ArgumentNullException(u
"key");
518 template <
typename T>
519 typename std::enable_if<!has_equality_operator<T>::value,
void>::type CheckIfNull(
const T& instance)
const
Implements common code for various dictionary-alike data structures (e. g. Dictionary,...
Definition: base_dictionary.h:100
BaseDictionary(BaseType *src, const Args &... args)
Copying constructor.
Definition: base_dictionary.h:161
ICollection< mapped_t > ValueCollection
Collection of values.
Definition: base_dictionary.h:133
const_iterator begin() const noexcept
Returns an iterator to the KVPair-wrapper for key-value-element of the container. Implemented in C# s...
Definition: base_dictionary.h:357
void SetTemplateWeakPtr(unsigned int argument) override
Definition: base_dictionary.h:104
const_iterator end() const noexcept
Returns an iterator to the KVPair-wrapper for key-value-element following the last element of the con...
Definition: base_dictionary.h:366
System::Details::VirtualizedIteratorBase< KVPair > * virtualizeBeginConstIterator() const override
Gets the implementation of begin const iterator for the current container.
Definition: base_dictionary.h:398
pointer_mode_t m_pointer_mode
Definition: base_dictionary.h:114
mapped_t GetValueOrDefault(const key_t &key, const mapped_t &defaultValue) const override
Returns value if found; or defaultValue otherwise.
Definition: base_dictionary.h:328
KeyValuePair< key_t, mapped_t > KVPair
Key-value pair type.
Definition: base_dictionary.h:135
void _add_range(std::initializer_list< typename Map::value_type > list)
C++ specific.
Definition: base_dictionary.h:309
virtual mapped_t & operator[](const key_t &key)
Accessor function.
Definition: base_dictionary.h:196
SharedPtr< IEnumerator< KeyValuePair< key_t, mapped_t > > > GetEnumerator() override=0
Creates enumerator instance, should be implemented by subclass.
Map m_map
Underlying C++ data structure.
Definition: base_dictionary.h:410
bool Contains(const KeyValuePair< key_t, mapped_t > &item) const override
Checks if key-value pair is present in dictionary, comparing both keys and values.
Definition: base_dictionary.h:416
stl_const_iterator cend() const noexcept
Returns an iterator to the element following the last element of the container. Implemented in STL-st...
Definition: base_dictionary.h:382
void Add(const key_t &key, const mapped_t &value) override
Adds key-value pair into dictionary.
Definition: base_dictionary.h:230
System::Details::VirtualizedIteratorBase< KVPair > * virtualizeEndIterator() override
Gets the implementation of end iterator for the current container.
Definition: base_dictionary.h:393
bool ContainsKey(const key_t &key) const override
Checks if key is present in dictionary.
Definition: base_dictionary.h:246
ICollection< key_t > KeyCollection
Make sure we use correct allocator with underlying storage type.
Definition: base_dictionary.h:131
~BaseDictionary() override
Destructor.
Definition: base_dictionary.h:474
const Map & data() const
Underlying data storage accessor.
Definition: base_dictionary.h:306
Map map_t
Internal map type.
Definition: base_dictionary.h:111
stl_const_iterator cbegin() const noexcept
Returns an iterator to the first element of the container. Implemented in STL-style....
Definition: base_dictionary.h:374
System::Details::VirtualizedIteratorBase< KVPair > * virtualizeEndConstIterator() const override
Gets the implementation of end const iterator for the current container.
Definition: base_dictionary.h:403
mapped_t GetValueOrNull(const key_t &key) const override
Returns value if found; or null otherwise. Make sense only for reference types.
Definition: base_dictionary.h:341
void idx_set(const key_t &key, mapped_t value) override
Keyed setter function. Alters or creates element.
Definition: base_dictionary.h:218
Map & data()
Underlying data storage accessor.
Definition: base_dictionary.h:303
KVPairIterator< KVPair, Map > iterator
Iterator type.
Definition: base_dictionary.h:141
bool Remove(const key_t &key) override
Removes specific key from dictionary.
Definition: base_dictionary.h:254
BaseDictionary()
Creates empty data structure.
Definition: base_dictionary.h:146
void Clear() override
Deletes all elements.
Definition: base_dictionary.h:187
mapped_t GetValueOrDefault(const key_t &key) const override
Returns value if found; or Value() otherwise.
Definition: base_dictionary.h:315
KVPairIterator< KVPair, Map > const_iterator
Const iterator type.
Definition: base_dictionary.h:143
BaseDictionary(BaseType *src)
Copying constructor.
Definition: base_dictionary.h:169
mapped_t idx_get(const key_t &key) const override
Keyed getter function.
Definition: base_dictionary.h:204
BaseDictionary(int, const Args &... args)
Forwarding constructor to push arguments into underlying map constructor.
Definition: base_dictionary.h:152
bool Remove(const KeyValuePair< key_t, mapped_t > &item) override
Removes specified key-value pair from dictionary, compares both keys and values.
Definition: base_dictionary.h:425
bool ContainsValue(const mapped_t &value)
Checks if value is present in dictionary. Uses operator == to compare values.
Definition: base_dictionary.h:291
bool TryGetValue(const key_t &key, mapped_t &value) const override
Looks for keyed value and retreives it if found.
Definition: base_dictionary.h:271
int32_t get_Count() const override
Gets elements count.
Definition: base_dictionary.h:182
IDictionary< typename Map::key_type, typename Map::mapped_type > BaseType
Implemented interface.
Definition: base_dictionary.h:138
System::Details::VirtualizedIteratorBase< KVPair > * virtualizeBeginIterator() override
Gets the implementation of begin iterator for the current container.
Definition: base_dictionary.h:388
Dictionary iterator that provides KeyValuePair notation.
Definition: base_dictionary.h:21
virtual ~DictionaryIterator()=default
Destructor.
DictionaryIterator(DictionaryIterator &&other) noexcept
Move constructor.
Definition: base_dictionary.h:55
DictionaryIterator(typename Dict::map_t::const_iterator &&iterator, typename Dict::map_t::const_iterator &&end) noexcept
Constructor.
Definition: base_dictionary.h:33
void DecrementIterator() override
Moves the iterator step back.
Definition: base_dictionary.h:71
void IncrementIterator() override
Moves the iterator step forward.
Definition: base_dictionary.h:65
void ShiftIteratorBy(std::ptrdiff_t offset) override
Moves the iterator by the specified number of steps.
Definition: base_dictionary.h:78
DictionaryIterator(const typename Dict::map_t::const_iterator &iterator, const typename Dict::map_t::const_iterator &end)
Constructor.
Definition: base_dictionary.h:46
System::Details::VirtualizedIteratorBase< typename Dict::KeyValuePairType > * CloneIterator() const override
Clones current iterator.
Definition: base_dictionary.h:85
Interface of collection of elements. Objects of this class should only be allocated using System::Mak...
Definition: icollection.h:20
Interface for dictionary-alike containers. Objects of this class should only be allocated using Syste...
Definition: idictionary.h:21
Adapting iterator, wraps std::pair into KVPair expected from Dictionary.
Definition: base_enumerator.h:109
Pair of key and value. This type should be allocated on stack and passed to functions by value or by ...
Definition: keyvalue_pair.h:20
std::pair< TKey, TValue > m_pair
Internal data structure.
Definition: keyvalue_pair.h:23
Pointer class to wrap types being allocated on heap. Use it to manage memory for classes inheriting O...
Definition: smart_ptr.h:180
Definition: db_command.h:9