ALib C++ Framework
by
Library Version: 2511 R0
Documentation generated by doxygen
Loading...
Searching...
No Matches
valuedescriptor.inl
Go to the documentation of this file.
1//==================================================================================================
2/// \file
3/// This header-file is part of module \alib_containers of the \aliblong.
4///
5/// \emoji :copyright: 2013-2025 A-Worx GmbH, Germany.
6/// Published under #"mainpage_license".
7//==================================================================================================
9
10/// Implements template type \p{TValueDescriptor}, which is, for example, offered by types
11/// #"HashTable" and #"LRUCacheTable".
12///
13/// Specifically, this implementation is used when the custom type to be stored with a container
14/// should be associated to a \p{TKkey}-type, which is not included in the stored type itself.
15/// Consequently, to associate custom type \p{TMapped} with the key, the #".StoredType"
16/// results in <c>std::pair<TKey,TMapped</c>.
17///
18/// Type definitions #"containers::HashMap" and #"containers::LRUCacheMap"
19/// establish a shortcut to their corresponding base type, which incorporates this helper.
20/// @tparam TKey The key type.
21/// @tparam TMapped The type of the mapped objects.
22template<typename TKey, typename TMapped>
24{
25 /// The type stored in the container.<br>
26 /// Container types typically publish an alias to this type.
27 /// For example, see #"LRUCacheTable::StoredType", or
28 /// see #"HashTable::StoredType".
29 using StoredType = std::pair<TKey, TMapped>;
30
31 /// The key type. (Exposes template parameter \p{TKey}).<br>
32 /// Container types typically publish an alias to this type.
33 /// For example, see #"LRUCacheTable::KeyType", or
34 /// see #"HashTable::KeyType".
35 using KeyType = TKey;
36
37 /// The type associated to a key. (Exposes template parameter \p{TMapped}).
38 /// The type of the mapped portion of the data.<br>
39 /// Container types typically publish an alias to this type.
40 /// For example, see #"LRUCacheTable::MappedType", or
41 /// see #"HashTable::MappedType".
42 using MappedType = TMapped;
43
44 /// Returns the first element of the given <c>std::pair</c>.
45 /// @param src The value to extract from.
46 /// @return The key-portion of the given value.
47 TKey& Key(std::pair<TKey, TMapped>& src) const { return src.first; }
48
49 /// Returns the second element of the given <c>std::pair</c>.
50 /// @param src The value to extract from.
51 /// @return The mapped-portion of the given value.
52 TMapped& Mapped(std::pair<TKey, TMapped>& src) const { return src.second; }
53};
54
55/// Implements template type \p{TValueDescriptor}, which is, for example, offered by types
56/// #"HashTable" and #"LRUCacheTable".
57///
58/// Specifically, this implementation is used with "sets", hence cases where the full portion
59/// of a type that is to be stored in a container should serve as the key to itself.
60///
61/// Type definitions #"containers::HashSet" and #"containers::LRUCacheSet"
62/// establish a shortcut to their corresponding base type, which incorporates this helper.
63///
64/// @tparam T The type stored in the container, serving likewise as the key-type.
65template<typename T>
67{
68 /// The type stored in the container.<br>
69 /// Container types typically publish an alias to this type.
70 /// For example, see #"LRUCacheTable::StoredType", or
71 /// see #"HashTable::StoredType".
72 using StoredType = T;
73
74 /// Exposes template parameter \p{T} and thus equals #".StoredType" and
75 /// #".MappedType".<br>
76 /// Container types typically publish an alias to this type.
77 /// For example, see #"LRUCacheTable::KeyType", or
78 /// see #"HashTable::KeyType".
79 using KeyType = T;
80
81 /// Exposes template parameter \p{T} and thus equals #".StoredType" and
82 /// #".KeyType".<br>
83 /// Container types typically publish an alias to this type.
84 /// For example, see #"LRUCacheTable::MappedType", or
85 /// see #"HashTable::MappedType".
86 using MappedType = T;
87
88 /// Returns the given \p{src} as is.
89 /// @param src The value to extract from.
90 /// @return The given reference.
91 KeyType& Key (T& src) const { return src; }
92
93 /// Returns the given \p{src} as is.
94 /// @param src The value to extract from.
95 /// @return The given reference.
96 MappedType& Mapped(T& src) const { return src; }
97};
98
99
100/// Implements template type \p{TValueDescriptor}, which is, for example, offered by types
101/// #"HashTable" and #"LRUCacheTable".
102///
103/// Specifically, this implementation causes a container neither to add a specific key-type to
104/// every stored custom object nor to expect instances of a custom object as the key-type itself.
105/// Instead, only a subset of the custom type is used as the key-type.
106/// @tparam T The type stored in the container.
107/// @tparam TKey The key type which is to be extracted out of \p{T} by the method #".Key".
108template<typename T, typename TKey>
110{
111 /// Exposes template parameter \p{T}.<br>
112 /// Container types typically publish an alias to this type.
113 /// For example, see #"LRUCacheTable::StoredType", or
114 /// see #"HashTable::StoredType".
115 using StoredType = T;
116
117 /// Exposes template parameter \p{TKey}.<br>
118 /// Container types typically publish an alias to this type.
119 /// For example, see #"LRUCacheTable::KeyType", or
120 /// see #"HashTable::KeyType".
121 using KeyType = TKey;
122
123 /// Exposes template parameter \p{T} and thus equals #".StoredType".<br>
124 /// Container types typically publish an alias to this type.
125 /// For example, see #"LRUCacheTable::MappedType", or
126 /// see #"HashTable::MappedType".
127 using MappedType = T;
128
129 /// A custom implementation has to return the key-portion of given \p{src}.
130 /// \attention This method is just declared. A type-specific implementation has to be
131 /// provided by the using code!
132 /// @param src The stored value to extract the key from.
133 /// @return The given reference.
134 KeyType& Key (T& src);
135
136 /// Returns the given \p{src} as is.
137 /// @param src The stored value to extract the mapped portion from.
138 /// @return The given reference.
139 MappedType& Mapped(T& src) const { return src; }
140};
141
142} // namespace [alib::containers]
#define ALIB_EXPORT
Definition alib.inl:562
MappedType & Mapped(T &src) const
std::pair< TKey, TMapped > StoredType
TKey & Key(std::pair< TKey, TMapped > &src) const
TMapped & Mapped(std::pair< TKey, TMapped > &src) const