Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Containers/STL/Utilities.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#include <algorithm>
5
7
8namespace Stroika::Foundation::Containers::STL {
9
10 template <typename ITERABLE_OF_T, typename T, Common::IPotentiallyComparer<T> EQUALS_COMPARER>
11 bool equal (const ITERABLE_OF_T& lhs, const ITERABLE_OF_T& rhs, EQUALS_COMPARER&& equalsComparer)
12 {
13 return lhs.size () == rhs.size () and equal (lhs.begin (), lhs.end (), rhs.begin (), equalsComparer);
14 }
15
16 /*
17 ********************************************************************************
18 ***************************** Containers::STL::Make ****************************
19 ********************************************************************************
20 */
21 template <typename CREATE_CONTAINER_TYPE, typename FROM_CONTAINER_TYPE>
22 inline CREATE_CONTAINER_TYPE Make (const FROM_CONTAINER_TYPE& rhs)
23 {
24 return CREATE_CONTAINER_TYPE (rhs.begin (), rhs.end ());
25 }
26
27 /*
28 ********************************************************************************
29 ************************ Containers::STL::Append *******************************
30 ********************************************************************************
31 */
32 template <typename TARGET_CONTAINER>
33 inline void Append (TARGET_CONTAINER* v)
34 {
36 }
37 template <typename TARGET_CONTAINER, typename SRC_CONTAINER>
38 inline void Append (TARGET_CONTAINER* v, const SRC_CONTAINER& v2)
39 {
41 size_t c = max (v->capacity (), v->size () + v2.size ());
42 v->reserve (c);
43 v->insert (v->end (), v2.begin (), v2.end ());
44 }
45 template <typename TARGET_CONTAINER, typename SRC_CONTAINER, typename... Args>
46 inline void Append (TARGET_CONTAINER* v, const SRC_CONTAINER& v2, Args... args)
47 {
49 Append (v, v2);
50 Append (v, args...);
51 }
52
53 /*
54 ********************************************************************************
55 ***************************** Containers::STL::Concat **************************
56 ********************************************************************************
57 */
58 template <typename TARGET_CONTAINER, typename SRC_CONTAINER, typename... Args>
59 TARGET_CONTAINER Concat (const SRC_CONTAINER& v2, Args... args)
60 {
61 TARGET_CONTAINER tmp;
62 Append (&tmp, v2, args...);
63 return tmp;
64 }
65
66 /*
67 ********************************************************************************
68 ************************ Containers::STL::Concatenate **************************
69 ********************************************************************************
70 */
71 template <typename SRC_CONTAINER, typename... Args>
72 inline vector<typename SRC_CONTAINER::value_type> Concatenate (const SRC_CONTAINER& v2, Args... args)
73 {
74 return Concat<vector<typename SRC_CONTAINER::value_type>> (v2, args...);
75 }
76
77 /*
78 ********************************************************************************
79 ************************ Containers::STL::Intersects ***************************
80 ********************************************************************************
81 */
82 template <typename T>
83 bool Intersects (const set<T>& s1, const set<T>& s2)
84 {
85 for (typename set<T>::const_iterator i = s1.begin (); i != s1.end (); ++i) {
86 if (s2.find (*i) != s2.end ()) {
87 return true;
88 }
89 }
90 return false;
91 }
92
93 /*
94 ********************************************************************************
95 ********************* Containers::STL::Intersection ****************************
96 ********************************************************************************
97 */
98 template <typename T>
99 vector<T> Intersection (const vector<T>& s1, const vector<T>& s2)
100 {
101 vector<T> result;
102 result.reserve (min (s1.size (), s2.size ()));
103 for (typename vector<T>::const_iterator i = s1.begin (); i != s1.end (); ++i) {
104 if (find (s2.begin (), s2.end (), *i) != s2.end ()) {
105 result.push_back (*i);
106 }
107 }
108 return result;
109 }
110 template <typename T>
111 set<T> Intersection (const set<T>& s1, const set<T>& s2)
112 {
113 set<T> result;
114 for (typename set<T>::const_iterator i = s1.begin (); i != s1.end (); ++i) {
115 if (s2.find (*i) != s2.end ()) {
116 result.insert (*i);
117 }
118 }
119 return result;
120 }
121 template <typename T>
122 void Intersection (set<T>* s1, const set<T>& s2)
123 {
124 RequireNotNull (s1);
125 // Sloppy - but hopefully adequate implementation
126 if (not s1->empty () and not s2.empty ()) {
127 *s1 = Intersection (*s1, s2);
128 }
129 }
130
131 /*
132 ********************************************************************************
133 **************************** Containers::STL::Union ****************************
134 ********************************************************************************
135 */
136 template <typename T, typename FROMCONTAINER>
137 void Union (set<T>* s1, const FROMCONTAINER& s2)
138 {
139 for (const auto& i : s2) {
140 if (s1->find (i) == s1->end ()) {
141 s1->insert (i);
142 }
143 }
144 }
145 template <typename T, typename FROMCONTAINER>
146 set<T> Union (const set<T>& s1, const FROMCONTAINER& s2)
147 {
148 set<T> result = s1;
149 Union (&result, s2);
150 return result;
151 }
152
153 /*
154 ********************************************************************************
155 **************************** Containers::STL::Difference ***********************
156 ********************************************************************************
157 */
158 template <typename T, typename FROMCONTAINER>
159 void Difference (set<T>* s1, const FROMCONTAINER& s2)
160 {
161 RequireNotNull (s1);
162 for (const auto& i : s2) {
163 if (s1->find (i) != s1->end ()) {
164 s1->erase (i);
165 }
166 }
167 }
168 template <typename T, typename FROMCONTAINER>
169 set<T> Difference (const set<T>& s1, const FROMCONTAINER& s2)
170 {
171 set<T> result = s1;
172 Difference (&result, s2);
173 return result;
174 }
175
176}
#define RequireNotNull(p)
Definition Assertions.h:347
set< T > Intersection(const set< T > &s1, const set< T > &s2)
bool Intersects(const set< T > &s1, const set< T > &s2)
bool equal(const ITERABLE_OF_T &lhs, const ITERABLE_OF_T &rhs, EQUALS_COMPARER &&equalsComparer={})
vector< typename SRC_CONTAINER::value_type > Concatenate(const SRC_CONTAINER &v2, Args... args)
construct a new vector<T> by concatenating the args together. Alias for Concat<vector<typename SRC_CO...
TARGET_CONTAINER Concat(const SRC_CONTAINER &v2, Args... args)
construct a new STL container by concatenating the args together.