// The MIT License (MIT) // Copyright (c) 2013-2016 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_TIE_HPP #define SOL_TIE_HPP #include "traits.hpp" namespace sol { namespace detail { template struct is_speshul : std::false_type {}; } template struct tie_size : std::tuple_size {}; template struct is_tieable : std::integral_constant::value > 0)> {}; template struct tie_t : public std::tuple...> { private: typedef std::tuple...> base_t; template void set(std::false_type, T&& target) { std::get<0>(*this) = std::forward(target); } template void set(std::true_type, T&& target) { typedef tie_size> value_size; typedef tie_size> tie_size; typedef std::conditional_t<(value_size::value < tie_size::value), value_size, tie_size> indices_size; typedef std::make_index_sequence indices; set_extra(detail::is_speshul>(), indices(), std::forward(target)); } template void set_extra(std::true_type, std::index_sequence, T&& target) { using std::get; (void)detail::swallow{ 0, (get(*this) = get(types(), target), 0)... , 0 }; } template void set_extra(std::false_type, std::index_sequence, T&& target) { using std::get; (void)detail::swallow{ 0, (get(*this) = get(target), 0)... , 0 }; } public: using base_t::base_t; template tie_t& operator= (T&& value) { typedef is_tieable> tieable; set(tieable(), std::forward(value)); return *this; } }; template struct tie_size<::sol::tie_t> : ::std::tuple_size<::std::tuple> { }; namespace adl_barrier_detail { template inline tie_t...> tie(Tn&&... argn) { return tie_t...>(std::forward(argn)...); } } using namespace adl_barrier_detail; } // sol #endif // SOL_TIE_HPP