///////////////////////////////////////////////////////////////////////////////
//
//  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
