1
2 //
3 // This source file is part of appleseed.
4 // Visit https://appleseedhq.net/ for additional information and resources.
5 //
6 // This software is released under the MIT license.
7 //
8 // Copyright (c) 2010-2013 Francois Beaune, Jupiter Jazz Limited
9 // Copyright (c) 2014-2018 Francois Beaune, The appleseedhq Organization
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a copy
12 // of this software and associated documentation files (the "Software"), to deal
13 // in the Software without restriction, including without limitation the rights
14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 // copies of the Software, and to permit persons to whom the Software is
16 // furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included in
19 // all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 // THE SOFTWARE.
28 //
29
30 #pragma once
31
32 // Standard headers.
33 #include <cassert>
34 #include <cstdarg>
35 #include <cstddef>
36 #include <string>
37 #include <vector>
38
39 namespace foundation
40 {
41
42 //
43 // Build a std::vector<> out of a set of POD values.
44 //
45
46 std::vector<std::string> make_vector(const char* v1);
47 std::vector<std::string> make_vector(const char* v1, const char* v2);
48 std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3);
49 std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4);
50 std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4, const char* v5);
51 std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4, const char* v5, const char* v6);
52
53 template <typename T> std::vector<T> make_vector(const T& v1);
54 template <typename T> std::vector<T> make_vector(const T& v1, const T& v2);
55 template <typename T> std::vector<T> make_vector(const T& v1, const T& v2, const T& v3);
56 template <typename T> std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4);
57 template <typename T> std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5);
58 template <typename T> std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6);
59
60 std::vector<std::string> make_vector_n(const size_t n, const char* val, ...);
61
62 template <typename T>
63 std::vector<T> make_vector_n(const size_t n, const T& val, ...);
64
65
66 //
67 // Implementation.
68 //
69
make_vector(const char * v1)70 inline std::vector<std::string> make_vector(const char* v1)
71 {
72 std::vector<std::string> vec;
73 vec.emplace_back(v1);
74 return vec;
75 }
76
make_vector(const char * v1,const char * v2)77 inline std::vector<std::string> make_vector(const char* v1, const char* v2)
78 {
79 std::vector<std::string> vec;
80 vec.emplace_back(v1);
81 vec.emplace_back(v2);
82 return vec;
83 }
84
make_vector(const char * v1,const char * v2,const char * v3)85 inline std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3)
86 {
87 std::vector<std::string> vec;
88 vec.emplace_back(v1);
89 vec.emplace_back(v2);
90 vec.emplace_back(v3);
91 return vec;
92 }
93
make_vector(const char * v1,const char * v2,const char * v3,const char * v4)94 inline std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4)
95 {
96 std::vector<std::string> vec;
97 vec.emplace_back(v1);
98 vec.emplace_back(v2);
99 vec.emplace_back(v3);
100 vec.emplace_back(v4);
101 return vec;
102 }
103
make_vector(const char * v1,const char * v2,const char * v3,const char * v4,const char * v5)104 inline std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4, const char* v5)
105 {
106 std::vector<std::string> vec;
107 vec.emplace_back(v1);
108 vec.emplace_back(v2);
109 vec.emplace_back(v3);
110 vec.emplace_back(v4);
111 vec.emplace_back(v5);
112 return vec;
113 }
114
make_vector(const char * v1,const char * v2,const char * v3,const char * v4,const char * v5,const char * v6)115 inline std::vector<std::string> make_vector(const char* v1, const char* v2, const char* v3, const char* v4, const char* v5, const char* v6)
116 {
117 std::vector<std::string> vec;
118 vec.emplace_back(v1);
119 vec.emplace_back(v2);
120 vec.emplace_back(v3);
121 vec.emplace_back(v4);
122 vec.emplace_back(v5);
123 vec.emplace_back(v6);
124 return vec;
125 }
126
127 template <typename T>
make_vector(const T & v1)128 std::vector<T> make_vector(const T& v1)
129 {
130 std::vector<T> vec;
131 vec.push_back(v1);
132 return vec;
133 }
134
135 template <typename T>
make_vector(const T & v1,const T & v2)136 std::vector<T> make_vector(const T& v1, const T& v2)
137 {
138 std::vector<T> vec;
139 vec.push_back(v1);
140 vec.push_back(v2);
141 return vec;
142 }
143
144 template <typename T>
make_vector(const T & v1,const T & v2,const T & v3)145 std::vector<T> make_vector(const T& v1, const T& v2, const T& v3)
146 {
147 std::vector<T> vec;
148 vec.push_back(v1);
149 vec.push_back(v2);
150 vec.push_back(v3);
151 return vec;
152 }
153
154 template <typename T>
make_vector(const T & v1,const T & v2,const T & v3,const T & v4)155 std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4)
156 {
157 std::vector<T> vec;
158 vec.push_back(v1);
159 vec.push_back(v2);
160 vec.push_back(v3);
161 vec.push_back(v4);
162 return vec;
163 }
164
165 template <typename T>
make_vector(const T & v1,const T & v2,const T & v3,const T & v4,const T & v5)166 std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5)
167 {
168 std::vector<T> vec;
169 vec.push_back(v1);
170 vec.push_back(v2);
171 vec.push_back(v3);
172 vec.push_back(v4);
173 vec.push_back(v5);
174 return vec;
175 }
176
177 template <typename T>
make_vector(const T & v1,const T & v2,const T & v3,const T & v4,const T & v5,const T & v6)178 std::vector<T> make_vector(const T& v1, const T& v2, const T& v3, const T& v4, const T& v5, const T& v6)
179 {
180 std::vector<T> vec;
181 vec.push_back(v1);
182 vec.push_back(v2);
183 vec.push_back(v3);
184 vec.push_back(v4);
185 vec.push_back(v5);
186 vec.push_back(v6);
187 return vec;
188 }
189
make_vector_n(const size_t n,const char * val,...)190 inline std::vector<std::string> make_vector_n(const size_t n, const char* val, ...)
191 {
192 assert(n > 0);
193
194 std::vector<std::string> vec;
195 vec.emplace_back(val);
196
197 va_list argptr;
198 va_start(argptr, val);
199
200 for (size_t i = 1; i < n; ++i)
201 vec.emplace_back(va_arg(argptr, char*));
202
203 va_end(argptr);
204
205 return vec;
206 }
207
208 template <typename T>
make_vector_n(const size_t n,const T & val,...)209 std::vector<T> make_vector_n(const size_t n, const T& val, ...)
210 {
211 assert(n > 0);
212
213 std::vector<T> vec;
214 vec.push_back(val);
215
216 va_list argptr;
217 va_start(argptr, val);
218
219 for (size_t i = 1; i < n; ++i)
220 vec.push_back(va_arg(argptr, T));
221
222 va_end(argptr);
223
224 return vec;
225 }
226
227 } // namespace foundation
228