Skip to content

Commit a2eb76e

Browse files
committed
add String/Sequence/Mapping concepts
- use them instead of SFINAE with `v8pp::convert` - allow to convert std::pair as tuple
1 parent 2e5e3d0 commit a2eb76e

File tree

4 files changed

+200
-245
lines changed

4 files changed

+200
-245
lines changed

test/test_convert.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ void test_convert_tuple(v8::Isolate* isolate)
148148
std::tuple<size_t, size_t, size_t> const tuple_3{ 1, 2, 3 };
149149
test_conv(isolate, tuple_3);
150150

151+
std::pair<bool, char> const pair{ false, 'N' };
152+
test_conv(isolate, pair);
153+
151154
check_ex<v8pp::invalid_argument>("Tuple", [isolate, &tuple_1]()
152155
{
153156
// incorrect number of elements

test/test_utility.cpp

Lines changed: 98 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include <map>
77
#include <unordered_map>
88

9+
namespace {
10+
911
template<typename Ret, typename F>
1012
void test_ret(F&&)
1113
{
@@ -61,11 +63,11 @@ void test_function_traits()
6163
char i(float) const volatile { return 0; }
6264
void operator()(int, char&) const volatile {}
6365

64-
float w;
66+
float w = 0;
6567
const int x = 1;
66-
volatile char y;
68+
volatile char y = 0;
6769
const volatile bool z = true;
68-
mutable volatile short zz;
70+
mutable volatile short zz = 0;
6971
};
7072

7173
test_ret<float>(&X::f);
@@ -171,83 +173,107 @@ void test_is_callable()
171173
static_assert(!is_callable<Y>::value, "Y is not callable");
172174
}
173175

174-
void test_type_traits()
176+
void test_concepts()
175177
{
176-
static_assert(v8pp::detail::is_string<std::string>::value, "std::string");
177-
static_assert(!v8pp::detail::is_sequence<std::string>::value, "std::string");
178-
static_assert(!v8pp::detail::is_mapping<std::string>::value, "std::string");
179-
static_assert(!v8pp::detail::is_array<std::string>::value, "std::string");
180-
181-
static_assert(v8pp::detail::is_string<std::string_view>::value, "std::string_view");
182-
static_assert(v8pp::detail::is_string<std::u16string>::value, "std::u16string");
183-
static_assert(v8pp::detail::is_string<std::u16string_view>::value, "std::u16string_view");
184-
static_assert(v8pp::detail::is_string<std::u32string>::value, "std::u32string");
185-
static_assert(v8pp::detail::is_string<std::u32string_view>::value, "std::u32string_view");
186-
static_assert(v8pp::detail::is_string<std::wstring>::value, "std::wstring");
187-
static_assert(v8pp::detail::is_string<std::wstring_view>::value, "std::wstring_view");
188-
static_assert(v8pp::detail::is_string<char const*>::value, "char const*");
189-
static_assert(v8pp::detail::is_string<char16_t const*>::value, "char16_t const*");
190-
static_assert(v8pp::detail::is_string<char32_t const*>::value, "char32_t const*");
191-
static_assert(v8pp::detail::is_string<wchar_t const*>::value, "wchar_t const*");
192-
193-
static_assert(!v8pp::detail::is_string<std::array<int, 1>>::value, "std::array");
194-
static_assert(!v8pp::detail::is_mapping<std::array<int, 1>>::value, "std::array");
195-
static_assert(!v8pp::detail::is_sequence<std::array<int, 1>>::value, "std::array");
196-
static_assert(!v8pp::detail::is_sequence<std::array<int, 1>>::value, "std::array");
197-
static_assert(v8pp::detail::is_array<std::array<int, 1>>::value, "std::array");
198-
static_assert(!v8pp::detail::has_reserve<std::array<int, 1>>::value, "std::array");
199-
200-
static_assert(!v8pp::detail::is_string<std::vector<char>>::value, "std::vector");
201-
static_assert(!v8pp::detail::is_mapping<std::vector<char>>::value, "std::vector");
202-
static_assert(v8pp::detail::is_sequence<std::vector<char>>::value, "std::vector");
203-
static_assert(!v8pp::detail::is_array<std::vector<char>>::value, "std::vector");
204-
static_assert(v8pp::detail::has_reserve<std::vector<char>>::value, "std::vector");
205-
206-
static_assert(!v8pp::detail::is_string<std::deque<int>>::value, "std::deque");
207-
static_assert(!v8pp::detail::is_mapping<std::deque<int>>::value, "std::deque");
208-
static_assert(v8pp::detail::is_sequence<std::deque<int>>::value, "std::deque");
209-
static_assert(!v8pp::detail::is_array<std::deque<int>>::value, "std::deque");
210-
static_assert(!v8pp::detail::has_reserve<std::deque<int>>::value, "std::deque");
211-
212-
static_assert(!v8pp::detail::is_string<std::list<bool>>::value, "std::list");
213-
static_assert(!v8pp::detail::is_mapping<std::list<bool>>::value, "std::list");
214-
static_assert(v8pp::detail::is_sequence<std::list<bool>>::value, "std::list");
215-
static_assert(!v8pp::detail::is_array<std::list<bool>>::value, "std::list");
216-
static_assert(!v8pp::detail::has_reserve<std::list<bool>>::value, "std::list");
217-
218-
static_assert(!v8pp::detail::is_string<std::tuple<int, char>>::value, "std::tuple");
219-
static_assert(!v8pp::detail::is_mapping<std::tuple<int, char>>::value, "std::tuple");
220-
static_assert(!v8pp::detail::is_sequence<std::tuple<int, char>>::value, "std::tuple");
221-
static_assert(!v8pp::detail::is_array<std::tuple<int, char>>::value, "std::tuple");
222-
static_assert(v8pp::detail::is_tuple<std::tuple<int, char>>::value, "std::tuple");
223-
224-
static_assert(!v8pp::detail::is_string<std::map<int, float>>::value, "std::map");
225-
static_assert(v8pp::detail::is_mapping<std::map<int, float>>::value, "std::map");
226-
static_assert(!v8pp::detail::is_sequence<std::map<int, char>>::value, "std::map");
227-
static_assert(!v8pp::detail::is_array<std::map<int, char>>::value, "std::map");
228-
229-
static_assert(!v8pp::detail::is_string<std::multimap<int, char>>::value, "std::multimap");
230-
static_assert(v8pp::detail::is_mapping<std::multimap<bool, std::string, std::greater<>>>::value, "std::multimap");
231-
static_assert(!v8pp::detail::is_sequence<std::multimap<int, char>>::value, "std::multimap");
232-
static_assert(!v8pp::detail::is_array<std::multimap<int, char>>::value, "std::multimap");
233-
234-
static_assert(!v8pp::detail::is_string<std::unordered_map<int, char>>::value, "std::unordered_map");
235-
static_assert(v8pp::detail::is_mapping<std::unordered_map<std::string, std::string>>::value, "std::unordered_map");
236-
static_assert(!v8pp::detail::is_sequence<std::unordered_map<int, char>>::value, "std::unordered_map");
237-
static_assert(!v8pp::detail::is_array<std::unordered_map<int, char>>::value, "std::unordered_map");
238-
239-
static_assert(!v8pp::detail::is_array<std::unordered_multimap<int, char>>::value, "std::unordered_multimap");
240-
static_assert(v8pp::detail::is_mapping<std::unordered_multimap<char, std::string>>::value, "std::unordered_multimap");
241-
static_assert(!v8pp::detail::is_sequence<std::unordered_multimap<int, char>>::value, "std::unordered_multimap");
242-
static_assert(!v8pp::detail::is_array<std::unordered_multimap<int, char>>::value, "std::unordered_multimap");
178+
static_assert(v8pp::detail::String<std::string>, "std::string");
179+
static_assert(!v8pp::detail::Sequence<std::string>, "std::string");
180+
static_assert(!v8pp::detail::Mapping<std::string>, "std::string");
181+
static_assert(!v8pp::detail::Array<std::string>, "std::string");
182+
static_assert(v8pp::detail::HasReserve<std::string>, "std::string");
183+
static_assert(!v8pp::detail::Tuple<std::string>, "std::string");
184+
185+
static_assert(v8pp::detail::String<std::string_view>, "std::string_view");
186+
static_assert(v8pp::detail::String<std::u16string>, "std::u16string");
187+
static_assert(v8pp::detail::String<std::u16string_view>, "std::u16string_view");
188+
static_assert(v8pp::detail::String<std::u32string>, "std::u32string");
189+
static_assert(v8pp::detail::String<std::u32string_view>, "std::u32string_view");
190+
static_assert(v8pp::detail::String<std::wstring>, "std::wstring");
191+
static_assert(v8pp::detail::String<std::wstring_view>, "std::wstring_view");
192+
static_assert(v8pp::detail::String<char const*>, "char const*");
193+
static_assert(v8pp::detail::String<char16_t const*>, "char16_t const*");
194+
static_assert(v8pp::detail::String<char32_t const*>, "char32_t const*");
195+
static_assert(v8pp::detail::String<wchar_t const*>, "wchar_t const*");
196+
197+
static_assert(!v8pp::detail::String<std::array<int, 1>>, "std::array");
198+
static_assert(!v8pp::detail::Mapping<std::array<int, 1>>, "std::array");
199+
static_assert(!v8pp::detail::Sequence<std::array<int, 1>>, "std::array");
200+
static_assert(!v8pp::detail::Sequence<std::array<int, 1>>, "std::array");
201+
static_assert(v8pp::detail::Array<std::array<int, 1>>, "std::array");
202+
static_assert(!v8pp::detail::HasReserve<std::array<int, 1>>, "std::array");
203+
static_assert(!v8pp::detail::Tuple<std::array<int, 1>>, "std::array");
204+
205+
static_assert(!v8pp::detail::String<std::vector<char>>, "std::vector");
206+
static_assert(!v8pp::detail::Mapping<std::vector<char>>, "std::vector");
207+
static_assert(v8pp::detail::Sequence<std::vector<char>>, "std::vector");
208+
static_assert(!v8pp::detail::Array<std::vector<char>>, "std::vector");
209+
static_assert(v8pp::detail::HasReserve<std::vector<char>>, "std::vector");
210+
static_assert(!v8pp::detail::Tuple<std::vector<char>>, "std::vector");
211+
212+
static_assert(!v8pp::detail::String<std::deque<int>>, "std::deque");
213+
static_assert(!v8pp::detail::Mapping<std::deque<int>>, "std::deque");
214+
static_assert(v8pp::detail::Sequence<std::deque<int>>, "std::deque");
215+
static_assert(!v8pp::detail::Array<std::deque<int>>, "std::deque");
216+
static_assert(!v8pp::detail::HasReserve<std::deque<int>>, "std::deque");
217+
static_assert(!v8pp::detail::Tuple<std::deque<int>>, "std::deque");
218+
219+
static_assert(!v8pp::detail::String<std::list<bool>>, "std::list");
220+
static_assert(!v8pp::detail::Mapping<std::list<bool>>, "std::list");
221+
static_assert(v8pp::detail::Sequence<std::list<bool>>, "std::list");
222+
static_assert(!v8pp::detail::Array<std::list<bool>>, "std::list");
223+
static_assert(!v8pp::detail::HasReserve<std::list<bool>>, "std::list");
224+
static_assert(!v8pp::detail::Tuple<std::list<bool>>, "std::list");
225+
226+
static_assert(!v8pp::detail::String<std::map<int, float>>, "std::map");
227+
static_assert(v8pp::detail::Mapping<std::map<int, float>>, "std::map");
228+
static_assert(!v8pp::detail::Sequence<std::map<int, char>>, "std::map");
229+
static_assert(!v8pp::detail::Array<std::map<int, char>>, "std::map");
230+
static_assert(!v8pp::detail::HasReserve<std::map<int, char>>, "std::map");
231+
static_assert(!v8pp::detail::Tuple<std::map<int, char>>, "std::map");
232+
233+
static_assert(!v8pp::detail::String<std::multimap<int, char>>, "std::multimap");
234+
static_assert(v8pp::detail::Mapping<std::multimap<bool, std::string, std::greater<>>>, "std::multimap");
235+
static_assert(!v8pp::detail::Sequence<std::multimap<int, char>>, "std::multimap");
236+
static_assert(!v8pp::detail::Array<std::multimap<int, char>>, "std::multimap");
237+
static_assert(!v8pp::detail::HasReserve<std::multimap<int, char>>, "std::multimap");
238+
static_assert(!v8pp::detail::Tuple<std::multimap<int, char>>, "std::multimap");
239+
240+
static_assert(!v8pp::detail::String<std::unordered_map<int, char>>, "std::unordered_map");
241+
static_assert(v8pp::detail::Mapping<std::unordered_map<std::string, std::string>>, "std::unordered_map");
242+
static_assert(!v8pp::detail::Sequence<std::unordered_map<int, char>>, "std::unordered_map");
243+
static_assert(!v8pp::detail::Array<std::unordered_map<int, char>>, "std::unordered_map");
244+
static_assert(v8pp::detail::HasReserve<std::unordered_map<int, char>>, "std::unordered_map");
245+
static_assert(!v8pp::detail::Tuple<std::unordered_map<int, char>>, "std::unordered_map");
246+
247+
static_assert(!v8pp::detail::String<std::unordered_multimap<int, char>>, "std::unordered_multimap");
248+
static_assert(v8pp::detail::Mapping<std::unordered_multimap<char, std::string>>, "std::unordered_multimap");
249+
static_assert(!v8pp::detail::Sequence<std::unordered_multimap<int, char>>, "std::unordered_multimap");
250+
static_assert(!v8pp::detail::Array<std::unordered_multimap<int, char>>, "std::unordered_multimap");
251+
static_assert(v8pp::detail::HasReserve<std::unordered_multimap<int, char>>, "std::unordered_multimap");
252+
static_assert(!v8pp::detail::Tuple<std::unordered_multimap<int, char>>, "std::unordered_multimap");
253+
254+
static_assert(v8pp::detail::Tuple<std::tuple<int, char, float>>, "std::tuple");
255+
static_assert(v8pp::detail::Tuple<std::tuple<std::tuple<bool>>>, "std::tuple");
256+
static_assert(v8pp::detail::Tuple<std::pair<int, int>>, "std::tuple");
257+
static_assert(!v8pp::detail::Tuple<std::array<int, 10>>, "std::tuple");
258+
static_assert(!v8pp::detail::Tuple<int>, "std::tuple");
259+
static_assert(!v8pp::detail::Tuple<int>, "std::tuple");
260+
static_assert(!v8pp::detail::String<std::tuple<int, char>>, "std::tuple");
261+
static_assert(!v8pp::detail::Mapping<std::tuple<int, char>>, "std::tuple");
262+
static_assert(!v8pp::detail::Sequence<std::tuple<int, char>>, "std::tuple");
263+
static_assert(!v8pp::detail::Array<std::tuple<int, char>>, "std::tuple");
264+
static_assert(!v8pp::detail::HasReserve<std::tuple<int, char>>, "std::tuple");
243265

244266
static_assert(!v8pp::detail::is_shared_ptr<int>::value, "int");
245267
static_assert(v8pp::detail::is_shared_ptr<std::shared_ptr<int>>::value, "int");
268+
static_assert(v8pp::detail::is_shared_ptr<std::shared_ptr<std::vector<char>>>::value, "std::vector<char");
269+
static_assert(!v8pp::detail::is_shared_ptr<std::string>::value, "std::string");
246270
}
247271

272+
} // unnamed namespace
273+
248274
void test_utility()
249275
{
250-
test_type_traits();
276+
test_concepts();
251277
test_function_traits();
252278
test_tuple_tail();
253279
test_is_callable();

0 commit comments

Comments
 (0)