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