/** \file
 *
 *  Contains the UnitRegistry class declaration.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 */

#ifndef UNITREGISTRY_H_
#define UNITREGISTRY_H_

#include "utils/FastMap.h"

class Str;
class Unit;
typedef FastMap<const Str, const Unit*> UnitMap;

/**
 *  Provides mapping between unit names and units.
 *  It has a singleton instance that contains the mapping.
 *
 *  \ingroup units
 */
class UnitRegistry
{
public:

    static void AddUnit( const Unit* unit );
    static const Unit* FindUnit( const Str& name );
    static unsigned int Size();
    static const Str& GetIndexedKey( unsigned int index );
    static const Unit* GetIndexedUnit( unsigned int index );

protected:

    static UnitRegistry* Instance_;
    UnitMap unitMap_;

    /// Makes sure that instance_ is deleted on shutdown
    class StaticDestructor
    {
    public:
        ~StaticDestructor();
    };

    /// Static instance of StaticDestructor
    static UnitRegistry::StaticDestructor StaticDestructor_;

private:

    UnitRegistry()
        : unitMap_()
    {}

};

#endif /*UNITREGISTRY_H_*/
