// The MIT License (MIT) // Copyright (c) 2013 Danny Y., Rapptz // 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. #include "traits.hpp" #include "object.hpp" #include "function.hpp" namespace sol { template struct proxy { private: Table& tbl; Key& key; public: template proxy( Table& table, T&& key ) : tbl( table ), key( std::forward( key ) ) { } template T get( ) const { return tbl.get( key ); } template proxy& set( T&& item ) { tbl.set( key, std::forward( item ) ); return *this; } template proxy& set_function( Args&&... args ) { tbl.set_function( key, std::forward( args )... ); return *this; } template EnableIf>> operator=( U&& other ) { tbl.set_function( key, std::forward( other ) ); } template DisableIf>> operator=( U&& other ) { tbl.set( key, std::forward( other ) ); } operator nil_t ( ) const { return get( ); } operator object( ) const { return get( ); } operator function( ) const { return get( ); } operator std::string( ) const { return get( ); } template operator bool( ) const { return get( ); } template operator double( ) const { return get( ); } template operator float( ) const { return get( ); } template operator int( ) const { return get( ); } template typename multi_return::type call( Args&&... args ) { return tbl.get(key)(types(), std::forward( args )...); } }; template inline bool operator== ( T&& left, const proxy& right ) { return left == right.template get>( ); } template inline bool operator== ( const proxy& right, T&& left ) { return right.template get>( ) == left; } template inline bool operator!= ( T&& left, const proxy& right ) { return right.template get>( ) != left; } template inline bool operator!= ( const proxy& right, T&& left ) { return right.template get>( ) != left; } } // sol