25 #ifndef INCLUDED_PassthruUniqueContainer_h_GUID_AD5E86CA_230D_4BBA_8DF0_F2C3811CFD00 26 #define INCLUDED_PassthruUniqueContainer_h_GUID_AD5E86CA_230D_4BBA_8DF0_F2C3811CFD00 41 namespace unique_container_policies {
51 using iterator =
typename Container::iterator;
52 using const_iterator =
typename Container::const_iterator;
53 using value_type =
typename Container::value_type;
54 using reference =
typename Container::reference;
55 using rv_reference =
typename Container::value_type &&;
56 using const_reference =
typename Container::const_reference;
58 static bool contains(Container
const &c, const_reference v) {
64 static bool remove(Container &c, const_reference v) {
76 static bool insert(Container &c, const_reference v) {
87 static bool insert(Container &c, rv_reference v) {
96 static auto find(Container
const &c, const_reference v)
97 -> decltype(std::find(begin(c), end(c), v)) {
98 return std::find(begin(c), end(c), v);
102 static auto find(Container &c, const_reference v)
103 -> decltype(std::find(begin(c), end(c), v)) {
104 return std::find(begin(c), end(c), v);
119 template <
template <
class X>
class Comparison = std::less>
123 using iterator =
typename Container::iterator;
124 using const_iterator =
typename Container::const_iterator;
125 using value_type =
typename Container::value_type;
126 using reference =
typename Container::reference;
127 using rv_reference =
typename Container::value_type &&;
128 using const_reference =
typename Container::const_reference;
129 using comparator = Comparison<value_type>;
140 -> decltype(std::lower_bound(begin(c), end(c), v,
141 policy::get_comparator())) {
142 return std::lower_bound(begin(c), end(c), v,
143 policy::get_comparator());
152 -> decltype(std::lower_bound(begin(c), end(c), v,
153 policy::get_comparator())) {
154 return std::lower_bound(begin(c), end(c), v,
155 policy::get_comparator());
160 static bool contains(Container
const &c, const_reference v) {
161 return std::binary_search(begin(c), end(c), v,
162 policy::get_comparator());
168 static bool remove(Container &c, const_reference v) {
182 static bool insert(Container &c, const_reference v) {
183 auto it = policy::lower_bound(c, v);
184 if (!policy::iter_indicates_contains(c, it, v)) {
196 static bool insert(Container &c, rv_reference v) {
197 auto it = policy::lower_bound(c, v);
198 if (!policy::iter_indicates_contains(c, it, v)) {
209 static auto find(Container
const &c, const_reference v)
210 -> decltype(policy::lower_bound(c, v)) {
211 auto it = policy::lower_bound(c, v);
212 return policy::iter_indicates_contains(c, it, v) ? it
220 static auto find(Container &c, const_reference v)
221 -> decltype(policy::lower_bound(c, v)) {
222 auto it = policy::lower_bound(c, v);
223 return policy::iter_indicates_contains(c, it, v) ? it
231 auto comp = policy::get_comparator();
232 return !(comp(a, b)) && !(comp(b, a));
238 template <
typename IteratorType>
240 IteratorType
const &it,
245 return check_equiv(*it, v);
249 static void sort(Container &c) {
250 std::sort(begin(c), end(c), policy::get_comparator());
256 template <
typename Container>
286 template <
typename Container,
288 typename... WrapperArgs>
291 typedef typename Policy::template Specialized<Container> policy;
295 using value_type =
typename Container::value_type;
296 using reference =
typename Container::reference;
297 using rv_reference =
typename Container::value_type &&;
298 using const_reference =
typename Container::const_reference;
304 bool insert(const_reference v) {
308 bool remove(const_reference v) {
313 Container
const &
container()
const {
return base::container(); }
318 Container &container() {
return base::container(); }
324 template <
typename Container,
326 typename... WrapperArgs>
332 using rv_reference =
typename Container::value_type &&;
333 using const_reference =
typename Container::const_reference;
335 bool insert(const_reference v) {
return base::insert(v); }
336 bool insert(rv_reference v) {
return base::insert(v); }
337 bool remove(const_reference v) {
return base::remove(v); }
340 Container
const &
container()
const {
return base::container(); }
345 #endif // INCLUDED_PassthruUniqueContainer_h_GUID_AD5E86CA_230D_4BBA_8DF0_F2C3811CFD00 static auto find(Container const &c, const_reference v) -> decltype(policy::lower_bound(c, v))
Helper function.
Definition: UniqueContainer.h:209
static bool insert(Container &c, const_reference v)
Insert from a const reference.
Definition: UniqueContainer.h:76
static bool contains(Container const &c, const_reference v)
Part of the interface expected by UniqueContainer.
Definition: UniqueContainer.h:160
Definition: RunLoopManager.h:42
apply_list< quote< or_ >, transform< Haystack, detail::is_< Needle >>> contains
Determines if type Needle is in the list Haystack - is an alias for a type that inherits std::true_ty...
Definition: Contains.h:49
static auto lower_bound(Container const &c, const_reference v) -> decltype(std::lower_bound(begin(c), end(c), v, policy::get_comparator()))
Helper function.
Definition: UniqueContainer.h:151
Definition: UniqueContainer.h:49
static void sort(Container &c)
Helper function.
Definition: UniqueContainer.h:249
static bool check_equiv(const_reference a, const_reference b)
Helper function.
Definition: UniqueContainer.h:230
Header providing a class template suitable for inheritance that wraps an arbitrary STL-like container...
A basic policy for use with a vector or similar container, where you have a comparison operator and t...
Definition: UniqueContainer.h:120
The main namespace for all C++ elements of the framework, internal and external.
Definition: namespace_osvr.dox:3
A basic policy for use with a vector or similar container, where you don't expect a lot of additions ...
Definition: UniqueContainer.h:48
Container const & container() const
Const access to the container is permitted.
Definition: UniqueContainer.h:313
static bool insert(Container &c, const_reference v)
Part of the interface expected by UniqueContainer.
Definition: UniqueContainer.h:182
static bool iter_indicates_contains(Container const &c, IteratorType const &it, const_reference v)
Helper function.
Definition: UniqueContainer.h:239
static auto lower_bound(Container &c, const_reference v) -> decltype(std::lower_bound(begin(c), end(c), v, policy::get_comparator()))
Helper function.
Definition: UniqueContainer.h:139
static auto find(Container &c, const_reference v) -> decltype(std::find(begin(c), end(c), v))
Time complexity: O(std::find) = O(n)
Definition: UniqueContainer.h:102
static bool insert(Container &c, rv_reference v)
Part of the interface expected by UniqueContainer.
Definition: UniqueContainer.h:196
bool contains(const_reference v)
Returns true iff the underlying container contains an instance of the given value.
Definition: UniqueContainer.h:301
static bool contains(Container const &c, const_reference v)
Time complexity: O(find) = O(n)
Definition: UniqueContainer.h:58
static comparator get_comparator()
Helper function to avoid vexing parse.
Definition: UniqueContainer.h:132
Definition: UniqueContainer.h:121
static auto find(Container &c, const_reference v) -> decltype(policy::lower_bound(c, v))
Helper function.
Definition: UniqueContainer.h:220
Container const & container() const
Const access to the container is permitted.
Definition: UniqueContainer.h:340
detail::ContainerWrapper_t< Container, Args... > ContainerWrapper
Parent class to inherit from to get a container with some functionality exposed.
Definition: ContainerWrapper.h:232
static auto find(Container const &c, const_reference v) -> decltype(std::find(begin(c), end(c), v))
Time complexity: O(std::find) = O(n)
Definition: UniqueContainer.h:96
A "Unique Container" designed for composition, not inheritance.
Definition: UniqueContainer.h:327
static bool remove(Container &c, const_reference v)
Time complexity: O(find) + O(member erase), which is O(n) (+ amortized constant time) for a std::vect...
Definition: UniqueContainer.h:64
A policy-based generic "Unique Container", that wraps ContainerWrapper (and thus an underlying contai...
Definition: UniqueContainer.h:289
static bool insert(Container &c, rv_reference v)
Insert from an rvalue-reference (move-insert).
Definition: UniqueContainer.h:87