#pragma once namespace rp { namespace type_trait { template< typename T > struct type2type { typedef T type_value; }; template< int T > struct int2type { enum { value = T }; }; } // type_trait template< class T > void safe_delete( T*& p ) { if( p ) delete p; p = 0; } //! sequence container wiper template< class _Ct > inline void wipe_seq( _Ct& container ) { typedef typename _Ct::iterator iterator; iterator end = container.end(); for( iterator itor = container.begin(); itor != end; ++itor ) if( *itor ) delete *itor; container.clear(); } /// 연관 컨테이너를 초기화 template< class _Ct > inline void wipe_assoc( _Ct& container ) { typedef typename _Ct::iterator iterator; iterator end = container.end(); for( iterator itor = container.begin(); itor != end; ++itor ) if( itor->second ) delete itor->second; container.clear(); } template< class _Ct, class _Ty > inline void remove_seq( _Ct& container, const _Ty& value ) { container.erase( std::remove( container.begin(), container.end(), value ), container.end() ); } /// 조건 복사 template< typename InputItor, typename OutputItor, typename Predicate > inline OutputItor copy_if( InputItor begin, InputItor end, OutputItor dest_begin, Predicate p ) { while( begin != end ) { if( p( *begin ) ) *dest_begin++ = *begin; ++begin; } return dest_begin; } } // rp