//=========== Copyright Valve Corporation, All rights reserved. ===============// // // Purpose: //=============================================================================// #ifndef PANORAMACXX_H #define PANORAMACXX_H #ifdef _WIN32 #pragma once #endif namespace panorama { // TEMPLATE CLASS integral_constant template struct panorama_integral_constant { // convenient template for integral constant types static const _Ty value = _Val; typedef _Ty value_type; typedef panorama_integral_constant<_Ty, _Val> type; operator value_type() const { // return stored value return (value); } }; typedef panorama_integral_constant true_type; typedef panorama_integral_constant false_type; // TEMPLATE CLASS _Cat_base template struct panorama_Cat_base : false_type { // base class for type predicates }; template<> struct panorama_Cat_base < true > : true_type { // base class for type predicates }; // TEMPLATE CLASS enable_if template struct panorama_enable_if { // type is undefined for assumed !_Test }; template struct panorama_enable_if < true, _Ty > { // type is _Ty for _Test typedef _Ty type; }; #define PANORAMA_IS_BASE_OF(_Base, _Der) \ : panorama_Cat_base<__is_base_of(_Base, _Der)> // TEMPLATE CLASS is_base_of template struct panorama_is_base_of PANORAMA_IS_BASE_OF( _Base, _Der ) { // determine whether _Base is a base of or the same as _Der }; #define PANORAMA_IS_ENUM(_Ty) \ : panorama_Cat_base<__is_enum(_Ty)> // TEMPLATE CLASS is_enum template struct panorama_is_enum PANORAMA_IS_ENUM( _Ty ) { // determine whether _Ty is an enumerated type }; // TEMPLATE CLASS is_lvalue_reference template struct panorama_is_lvalue_reference : false_type { // determine whether _Ty is an lvalue reference }; template struct panorama_is_lvalue_reference < _Ty& > : true_type { // determine whether _Ty is an lvalue reference }; // TEMPLATE remove_reference template struct panorama_remove_reference { // remove reference typedef _Ty type; }; template struct panorama_remove_reference < _Ty& > { // remove reference typedef _Ty type; }; template struct panorama_remove_reference < _Ty&& > { // remove rvalue reference typedef _Ty type; }; // TEMPLATE FUNCTION forward template inline _Ty&& panorama_forward( typename panorama_remove_reference<_Ty>::type& _Arg ) { // forward an lvalue return (static_cast<_Ty&&>(_Arg)); } template inline _Ty&& panorama_forward( typename panorama_remove_reference<_Ty>::type&& _Arg ) { // forward anything static_assert(!panorama_is_lvalue_reference<_Ty>::value, "bad forward call"); return (static_cast<_Ty&&>(_Arg)); } } #endif // PANORAMACXX_H