Skip to content

Commit 814026b

Browse files
committed
add void_t, negation, conjunction that are missing in C+14
after backportig gegeric converters from c++17 branch.
1 parent d21740a commit 814026b

File tree

3 files changed

+49
-20
lines changed

3 files changed

+49
-20
lines changed

test/test_utility.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ void test_type_traits()
190190
static_assert(v8pp::detail::is_string<v8pp::string_view>::value, "std::string_view");
191191
static_assert(v8pp::detail::is_string<std::u16string>::value, "std::u16string");
192192
static_assert(v8pp::detail::is_string<v8pp::u16string_view>::value, "std::u16string_view");
193-
static_assert(v8pp::detail::is_string<std::u32string>::value, "std::u32string");
194-
static_assert(v8pp::detail::is_string<v8pp::u32string_view>::value, "std::u32string_view");
193+
//static_assert(v8pp::detail::is_string<std::u32string>::value, "std::u32string");
194+
//static_assert(v8pp::detail::is_string<v8pp::u32string_view>::value, "std::u32string_view");
195195
static_assert(v8pp::detail::is_string<std::wstring>::value, "std::wstring");
196196
static_assert(v8pp::detail::is_string<v8pp::wstring_view>::value, "std::wstring_view");
197197
static_assert(v8pp::detail::is_string<char const*>::value, "char const*");

v8pp/convert.hpp

+8-13
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,10 @@
1212
#include <v8.h>
1313

1414
#include <climits>
15-
#include <string>
16-
#include <array>
17-
#include <vector>
18-
#include <map>
15+
#include <limits>
1916
#include <memory>
20-
#include <iterator>
2117
#include <stdexcept>
2218
#include <type_traits>
23-
#include <typeinfo>
2419

2520
#include "v8pp/ptr_traits.hpp"
2621
#include "v8pp/utility.hpp"
@@ -456,14 +451,14 @@ struct convert<v8::Local<T>>
456451

457452

458453
template<typename T>
459-
struct is_wrapped_class : std::conjunction<
454+
struct is_wrapped_class : conjunction<
460455
std::is_class<T>,
461-
std::negation<detail::is_string<T>>,
462-
std::negation<detail::is_mapping<T>>,
463-
std::negation<detail::is_sequence<T>>,
464-
std::negation<detail::is_array<T>>,
465-
std::negation<detail::is_tuple<T>>,
466-
std::negation<detail::is_shared_ptr<T>>
456+
negation<detail::is_string<T>>,
457+
negation<detail::is_mapping<T>>,
458+
negation<detail::is_sequence<T>>,
459+
negation<detail::is_array<T>>,
460+
negation<detail::is_tuple<T>>,
461+
negation<detail::is_shared_ptr<T>>
467462
> {};
468463

469464
// convert specialization for wrapped user classes

v8pp/utility.hpp

+39-5
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,45 @@ class basic_string_view
112112

113113
using string_view = basic_string_view<char>;
114114
using u16string_view = basic_string_view<char16_t>;
115-
using u32string_view = basic_string_view<char32_t>;
116115
using wstring_view = basic_string_view<wchar_t>;
116+
117117
} // namespace v8pp {
118118
#endif
119119

120+
namespace v8pp
121+
{
122+
/////////////////////////////////////////////////////////////////////////////
123+
//
124+
// void_t
125+
//
126+
#ifdef __cpp_lib_void_t
127+
using std::void_t;
128+
#else
129+
template<typename...> using void_t = void;
130+
#endif
131+
132+
/////////////////////////////////////////////////////////////////////////////
133+
//
134+
// conjunction, disjunction, negation
135+
//
136+
#ifdef __cpp_lib_logical_traits
137+
using std::conjunction;
138+
using std::disjunction;
139+
using std::negation;
140+
#else
141+
template<bool...> struct bool_pack {};
142+
143+
template<typename... Bs>
144+
using conjunction = std::is_same<bool_pack<true, Bs::value...>, bool_pack<Bs::value..., true>>;
145+
146+
template<typename... Bs>
147+
using disjunction = std::integral_constant<bool, !conjunction<Bs...>::value>;
148+
149+
template<typename B>
150+
using negation = std::integral_constant<bool, !B::value>;
151+
#endif
152+
} // namespace v8pp {
153+
120154
namespace v8pp { namespace detail {
121155

122156
template<typename T>
@@ -157,7 +191,7 @@ template<typename T, typename U = void>
157191
struct is_mapping : std::false_type {};
158192

159193
template<typename T>
160-
struct is_mapping<T, std::void_t<typename T::key_type, typename T::mapped_type,
194+
struct is_mapping<T, void_t<typename T::key_type, typename T::mapped_type,
161195
decltype(std::declval<T>().begin()), decltype(std::declval<T>().end())>> : std::true_type {};
162196

163197
/////////////////////////////////////////////////////////////////////////////
@@ -168,9 +202,9 @@ template<typename T, typename U = void>
168202
struct is_sequence : std::false_type {};
169203

170204
template<typename T>
171-
struct is_sequence<T, std::void_t<typename T::value_type,
205+
struct is_sequence<T, void_t<typename T::value_type,
172206
decltype(std::declval<T>().begin()), decltype(std::declval<T>().end()),
173-
decltype(std::declval<T>().emplace_back(std::declval<typename T::value_type>()))>> : std::negation<is_string<T>> {};
207+
decltype(std::declval<T>().emplace_back(std::declval<typename T::value_type>()))>> : negation<is_string<T>> {};
174208

175209
/////////////////////////////////////////////////////////////////////////////
176210
//
@@ -183,7 +217,7 @@ struct has_reserve : std::false_type
183217
};
184218

185219
template<typename T>
186-
struct has_reserve<T, std::void_t<decltype(std::declval<T>().reserve(0))>> : std::true_type
220+
struct has_reserve<T, void_t<decltype(std::declval<T>().reserve(0))>> : std::true_type
187221
{
188222
static void reserve(T& container, size_t capacity)
189223
{

0 commit comments

Comments
 (0)