// sol2 // The MIT License (MIT) // Copyright (c) 2013-2021 Rapptz, ThePhD and contributors // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifndef SOL_TRAITS_HPP #define SOL_TRAITS_HPP #include #include #include #include #include #include #include #include #include #include #include #include #if SOL_IS_ON(SOL_STD_VARIANT) #include #endif // variant is weird on XCode, thanks XCode namespace sol { namespace meta { template struct unwrapped { typedef T type; }; template struct unwrapped> { typedef T type; }; template using unwrapped_t = typename unwrapped::type; template struct unwrap_unqualified : unwrapped> { }; template using unwrap_unqualified_t = typename unwrap_unqualified::type; template struct remove_member_pointer; template struct remove_member_pointer { typedef R type; }; template struct remove_member_pointer { typedef R type; }; template using remove_member_pointer_t = remove_member_pointer; template struct all_same : std::true_type { }; template struct all_same : std::integral_constant::value && all_same::value> { }; template struct any_same : std::false_type { }; template struct any_same : std::integral_constant::value || any_same::value> { }; template constexpr inline bool any_same_v = any_same::value; template using boolean = std::integral_constant; template constexpr inline bool boolean_v = boolean::value; template using neg = boolean; template constexpr inline bool neg_v = neg::value; template struct all : boolean { }; template struct all : std::conditional_t, boolean> { }; template struct any : boolean { }; template struct any : std::conditional_t, any> { }; template constexpr inline bool all_v = all::value; template constexpr inline bool any_v = any::value; enum class enable_t { _ }; constexpr const auto enabler = enable_t::_; template using disable_if_t = std::enable_if_t; template using enable = std::enable_if_t::value, enable_t>; template using disable = std::enable_if_t>::value, enable_t>; template using enable_any = std::enable_if_t::value, enable_t>; template using disable_any = std::enable_if_t>::value, enable_t>; template struct find_in_pack_v : boolean { }; template struct find_in_pack_v : any, find_in_pack_v> { }; namespace meta_detail { template struct index_in_pack : std::integral_constant { }; template struct index_in_pack : conditional_t::value, std::integral_constant, index_in_pack> { }; } // namespace meta_detail template struct index_in_pack : meta_detail::index_in_pack<0, T, Args...> { }; template struct index_in : meta_detail::index_in_pack<0, T, List> { }; template struct index_in> : meta_detail::index_in_pack<0, T, Args...> { }; template struct at_in_pack { }; template using at_in_pack_t = typename at_in_pack::type; template struct at_in_pack : std::conditional> { }; template struct at_in_pack<0, Arg, Args...> { typedef Arg type; }; namespace meta_detail { template using on_even = meta::boolean<(TI::value % 2) == 0>; template using on_odd = meta::boolean<(TI::value % 2) == 1>; template using on_always = std::true_type; template