// sol3 // The MIT License (MIT) // Copyright (c) 2013-2019 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 "pointer_like.hpp" #include "base_traits.hpp" #include "string_view.hpp" #include #include #include #include #include #include #include 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 class Pred, typename... Ts> struct count_for_pack : std::integral_constant {}; template class Pred, typename T, typename... Ts> struct count_for_pack : 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 : conditional_t(Pred::value)>, count_2_for_pack(Pred::value), Pred, Ts...>> {}; } // namespace meta_detail template