| /////////////////////////////////////////////////////////////////////////////// | |
| // | |
| // The contents of this file are subject to the Mozilla Public License | |
| // Version 1.1 (the "License"); you may not use this file except in | |
| // compliance with the License. You may obtain a copy of the License at | |
| // http://www.mozilla.org/MPL/ | |
| // | |
| // Software distributed under the License is distributed on an "AS IS" | |
| // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the | |
| // License for the specific language governing rights and limitations | |
| // under the License. | |
| // | |
| // The Original Code is MP4v2. | |
| // | |
| // The Initial Developer of the Original Code is Kona Blend. | |
| // Portions created by Kona Blend are Copyright (C) 2008. | |
| // All Rights Reserved. | |
| // | |
| // Contributors: | |
| // Kona Blend, kona8lend@@gmail.com | |
| // | |
| /////////////////////////////////////////////////////////////////////////////// | |
| #ifndef MP4V2_IMPL_ENUM_TCC | |
| #define MP4V2_IMPL_ENUM_TCC | |
| #include <sstream> | |
| namespace mp4v2 { namespace impl { | |
| /////////////////////////////////////////////////////////////////////////////// | |
| template <typename T, T UNDEFINED> | |
| Enum<T,UNDEFINED>::Enum() | |
| : mapToType ( _mapToType ) | |
| , mapToString ( _mapToString ) | |
| { | |
| for( const Entry* p = data; p->type != UNDEFINED; p++ ) { | |
| _mapToType.insert( typename MapToType::value_type( p->compact, p )); | |
| _mapToString.insert( typename MapToString::value_type( p->type, p )); | |
| } | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| template <typename T, T UNDEFINED> | |
| Enum<T,UNDEFINED>::~Enum() | |
| { | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| template <typename T, T UNDEFINED> | |
| string | |
| Enum<T,UNDEFINED>::toString( T value, bool formal ) const | |
| { | |
| string buffer; | |
| return toString( value, buffer, formal ); | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| template <typename T, T UNDEFINED> | |
| string& | |
| Enum<T,UNDEFINED>::toString( T value, string& buffer, bool formal ) const | |
| { | |
| const typename MapToString::const_iterator found = _mapToString.find( value ); | |
| if( found != _mapToString.end() ) { | |
| const Entry& entry = *(found->second); | |
| buffer = formal ? entry.formal : entry.compact; | |
| return buffer; | |
| } | |
| ostringstream oss; | |
| oss << "UNDEFINED(" << value << ")"; | |
| buffer = oss.str(); | |
| return buffer; | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| template <typename T, T UNDEFINED> | |
| T | |
| Enum<T,UNDEFINED>::toType( const string& value ) const | |
| { | |
| // if number perform enum lookup | |
| int ivalue; | |
| istringstream iss( value ); | |
| iss >> ivalue; | |
| if( iss.rdstate() == ios::eofbit ) { | |
| const typename MapToString::const_iterator found = _mapToString.find( static_cast<T>(ivalue) ); | |
| if( found != _mapToString.end() ) | |
| return found->second->type; | |
| } | |
| // exact match | |
| const typename MapToType::const_iterator found = _mapToType.find( value ); | |
| if( found != _mapToType.end() ) | |
| return found->second->type; | |
| // partial match | |
| int matches = 0; | |
| T matched = static_cast<T>( 0 ); | |
| const typename MapToType::const_iterator ie = _mapToType.end(); | |
| for( typename MapToType::const_iterator it = _mapToType.begin(); it != ie; it++ ) { | |
| const Entry& entry = *(it->second); | |
| if( entry.compact.find( value ) == 0 ) { | |
| matches++; | |
| matched = entry.type; | |
| } | |
| } | |
| return (matches == 1) ? matched : UNDEFINED; | |
| } | |
| ////////////////////////////////////////////////////////////////////////////// | |
| }} // namespace mp4v2::impl | |
| #endif // MP4V2_IMPL_ENUM_TCC |