xref: /aosp_15_r20/external/deqp/framework/delibs/decpp/deSTLUtil.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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