// sol2 // The MIT License (MIT) // Copyright (c) 2013-2018 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 "tuple.hpp" #include "bind_traits.hpp" #include "string_view.hpp" #include #include #include #include #include #include #include namespace sol { template using index_value = std::integral_constant; namespace meta { typedef std::array sfinae_yes_t; typedef std::array sfinae_no_t; template struct identity { typedef T type; }; template using identity_t = typename identity::type; template struct is_tuple : std::false_type {}; template struct is_tuple> : std::true_type {}; template struct is_builtin_type : std::integral_constant::value || std::is_pointer::value || std::is_array::value> {}; 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; namespace meta_detail { template class Templ> struct is_specialization_of : std::false_type {}; template class Templ> struct is_specialization_of, Templ> : std::true_type {}; } // namespace meta_detail template class Templ> using is_specialization_of = meta_detail::is_specialization_of, Templ>; 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 using boolean = std::integral_constant; template using invoke_t = typename T::type; template using invoke_b = boolean; template using neg = boolean; template using condition = std::conditional_t; template struct all : boolean {}; template struct all : condition, boolean> {}; template struct any : boolean {}; template struct any : condition, any> {}; 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 : std::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 class Pred, typename... Ts> struct count_for_pack : std::integral_constant {}; template class Pred, typename T, typename... Ts> struct count_for_pack : std::conditional_t < sizeof...(Ts) == 0 || Limit<2, std::integral_constant(Limit != 0 && Pred::value)>, count_for_pack(Pred::value), Pred, Ts...>> {}; template class Pred, typename... Ts> struct count_2_for_pack : std::integral_constant {}; template class Pred, typename T, typename U, typename... Ts> struct count_2_for_pack : std::conditional_t(Pred::value)>, count_2_for_pack(Pred::value), Pred, Ts...>> {}; } // namespace meta_detail template