1*35238bceSAndroid Build Coastguard Worker #ifndef _DESTLUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _DESTLUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements C++ Base Library
5*35238bceSAndroid Build Coastguard Worker * -----------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Utilities for STL containers.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "deDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include <algorithm>
29*35238bceSAndroid Build Coastguard Worker #include <stdexcept>
30*35238bceSAndroid Build Coastguard Worker #include <utility>
31*35238bceSAndroid Build Coastguard Worker #include <iterator>
32*35238bceSAndroid Build Coastguard Worker #include <vector>
33*35238bceSAndroid Build Coastguard Worker #include <limits>
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker namespace de
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker
38*35238bceSAndroid Build Coastguard Worker void STLUtil_selfTest(void);
39*35238bceSAndroid Build Coastguard Worker
40*35238bceSAndroid Build Coastguard Worker //! Test whether `item` is a member of `container`. The type `C` must be an
41*35238bceSAndroid Build Coastguard Worker //! AssociativeContainer.
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker template <typename C>
contains(const C & container,const typename C::key_type & item)44*35238bceSAndroid Build Coastguard Worker inline bool contains(const C &container, const typename C::key_type &item)
45*35238bceSAndroid Build Coastguard Worker {
46*35238bceSAndroid Build Coastguard Worker const typename C::const_iterator it = container.find(item);
47*35238bceSAndroid Build Coastguard Worker return (it != container.end());
48*35238bceSAndroid Build Coastguard Worker }
49*35238bceSAndroid Build Coastguard Worker
50*35238bceSAndroid Build Coastguard Worker template <typename I, typename K>
contains(const I & begin,const I & end,const K & item)51*35238bceSAndroid Build Coastguard Worker inline bool contains(const I &begin, const I &end, const K &item)
52*35238bceSAndroid Build Coastguard Worker {
53*35238bceSAndroid Build Coastguard Worker const I it = std::find(begin, end, item);
54*35238bceSAndroid Build Coastguard Worker return (it != end);
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker template <typename C>
intersection(const C & s1,const C & s2)58*35238bceSAndroid Build Coastguard Worker C intersection(const C &s1, const C &s2)
59*35238bceSAndroid Build Coastguard Worker {
60*35238bceSAndroid Build Coastguard Worker C ret;
61*35238bceSAndroid Build Coastguard Worker std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::insert_iterator<C>(ret, ret.begin()));
62*35238bceSAndroid Build Coastguard Worker return ret;
63*35238bceSAndroid Build Coastguard Worker }
64*35238bceSAndroid Build Coastguard Worker
65*35238bceSAndroid Build Coastguard Worker template <typename C>
set_union(const C & s1,const C & s2)66*35238bceSAndroid Build Coastguard Worker C set_union(const C &s1, const C &s2)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker C ret;
69*35238bceSAndroid Build Coastguard Worker std::set_union(s1.begin(), s1.end(), s2.begin(), s2.end(), std::insert_iterator<C>(ret, ret.begin()));
70*35238bceSAndroid Build Coastguard Worker return ret;
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker
73*35238bceSAndroid Build Coastguard Worker // Utilities for map-like container types
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Worker //! Return a pointer to the value mapped to `key`, or null if not found.
76*35238bceSAndroid Build Coastguard Worker template <typename M>
tryLookup(const M & map,const typename M::key_type & key)77*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type *tryLookup(const M &map, const typename M::key_type &key)
78*35238bceSAndroid Build Coastguard Worker {
79*35238bceSAndroid Build Coastguard Worker typename M::const_iterator it = map.find(key);
80*35238bceSAndroid Build Coastguard Worker if (it == map.end())
81*35238bceSAndroid Build Coastguard Worker return DE_NULL;
82*35238bceSAndroid Build Coastguard Worker return &it->second;
83*35238bceSAndroid Build Coastguard Worker }
84*35238bceSAndroid Build Coastguard Worker
85*35238bceSAndroid Build Coastguard Worker //! Return a reference to the value mapped to `key`, or `fallback` if not found.
86*35238bceSAndroid Build Coastguard Worker template <typename M>
lookupDefault(const M & map,const typename M::key_type & key,const typename M::mapped_type & fallback)87*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type &lookupDefault(const M &map, const typename M::key_type &key,
88*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type &fallback)
89*35238bceSAndroid Build Coastguard Worker {
90*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type *ptr = tryLookup(map, key);
91*35238bceSAndroid Build Coastguard Worker return ptr == DE_NULL ? fallback : *ptr;
92*35238bceSAndroid Build Coastguard Worker }
93*35238bceSAndroid Build Coastguard Worker
94*35238bceSAndroid Build Coastguard Worker //! Return a reference to the value mapped to `key`, or raise
95*35238bceSAndroid Build Coastguard Worker //! `std::out_of_range` if not found.
96*35238bceSAndroid Build Coastguard Worker template <typename M>
lookup(const M & map,const typename M::key_type & key)97*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type &lookup(const M &map, const typename M::key_type &key)
98*35238bceSAndroid Build Coastguard Worker {
99*35238bceSAndroid Build Coastguard Worker const typename M::mapped_type *ptr = tryLookup(map, key);
100*35238bceSAndroid Build Coastguard Worker if (ptr == DE_NULL)
101*35238bceSAndroid Build Coastguard Worker throw std::out_of_range("key not found in map");
102*35238bceSAndroid Build Coastguard Worker return *ptr;
103*35238bceSAndroid Build Coastguard Worker }
104*35238bceSAndroid Build Coastguard Worker
105*35238bceSAndroid Build Coastguard Worker //! Map `key` to `value`. This differs from `map[key] = value` in that there
106*35238bceSAndroid Build Coastguard Worker //! is no default construction and assignment involved.
107*35238bceSAndroid Build Coastguard Worker template <typename M>
insert(M & map,const typename M::key_type & key,const typename M::mapped_type & value)108*35238bceSAndroid Build Coastguard Worker bool insert(M &map, const typename M::key_type &key, const typename M::mapped_type &value)
109*35238bceSAndroid Build Coastguard Worker {
110*35238bceSAndroid Build Coastguard Worker typename M::value_type entry(key, value);
111*35238bceSAndroid Build Coastguard Worker std::pair<typename M::iterator, bool> ret = map.insert(entry);
112*35238bceSAndroid Build Coastguard Worker return ret.second;
113*35238bceSAndroid Build Coastguard Worker }
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker // Returns the total size in bytes for contiguous-storage containers.
116*35238bceSAndroid Build Coastguard Worker template <typename T>
dataSize(const T & container)117*35238bceSAndroid Build Coastguard Worker size_t dataSize(const T &container)
118*35238bceSAndroid Build Coastguard Worker {
119*35238bceSAndroid Build Coastguard Worker return (container.size() * sizeof(typename T::value_type));
120*35238bceSAndroid Build Coastguard Worker }
121*35238bceSAndroid Build Coastguard Worker
122*35238bceSAndroid Build Coastguard Worker // Returns the data pointer or a null pointer if the vector is empty.
123*35238bceSAndroid Build Coastguard Worker template <typename T>
dataOrNull(std::vector<T> & container)124*35238bceSAndroid Build Coastguard Worker T *dataOrNull(std::vector<T> &container)
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker return (container.empty() ? nullptr : container.data());
127*35238bceSAndroid Build Coastguard Worker }
128*35238bceSAndroid Build Coastguard Worker
129*35238bceSAndroid Build Coastguard Worker // Returns the data pointer or a null pointer if the vector is empty.
130*35238bceSAndroid Build Coastguard Worker template <typename T>
dataOrNull(const std::vector<T> & container)131*35238bceSAndroid Build Coastguard Worker const T *dataOrNull(const std::vector<T> &container)
132*35238bceSAndroid Build Coastguard Worker {
133*35238bceSAndroid Build Coastguard Worker return (container.empty() ? nullptr : container.data());
134*35238bceSAndroid Build Coastguard Worker }
135*35238bceSAndroid Build Coastguard Worker
136*35238bceSAndroid Build Coastguard Worker // Returns the container size() as an uint32_t value.
137*35238bceSAndroid Build Coastguard Worker template <typename T>
sizeU32(const T & container)138*35238bceSAndroid Build Coastguard Worker uint32_t sizeU32(const T &container)
139*35238bceSAndroid Build Coastguard Worker {
140*35238bceSAndroid Build Coastguard Worker const size_t sz = container.size();
141*35238bceSAndroid Build Coastguard Worker DE_ASSERT(sz <= static_cast<size_t>(std::numeric_limits<uint32_t>::max()));
142*35238bceSAndroid Build Coastguard Worker return static_cast<uint32_t>(sz);
143*35238bceSAndroid Build Coastguard Worker }
144*35238bceSAndroid Build Coastguard Worker
145*35238bceSAndroid Build Coastguard Worker } // namespace de
146*35238bceSAndroid Build Coastguard Worker
147*35238bceSAndroid Build Coastguard Worker #endif // _DESTLUTIL_HPP
148