// 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 { 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( indices(), std::forward( target ) ); } template void set( 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> bondable; set( bondable(), 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