/*  Copyright (c) MediaArea.net SARL. All Rights Reserved.
 *
 *  Use of this source code is governed by a zlib-style license that can
 *  be found in the License.txt file in the root of the source tree.
 */
 
//---------------------------------------------------------------------------
#include "ZenLib/PreComp.h"
#ifdef __BORLANDC__
    #pragma hdrstop
#endif
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
#include "ZenLib/Conf_Internal.h"
//---------------------------------------------------------------------------
 
//---------------------------------------------------------------------------
#ifdef ZENLIB_USEWX
    #include <wx/strconv.h>
#endif //ZENLIB_USEWX
#include <algorithm>
#include "ZenLib/InfoMap.h"
using namespace std;
//---------------------------------------------------------------------------
 
namespace ZenLib
{
 
//---------------------------------------------------------------------------
const Ztring InfoMap_EmptyZtring_Const; //Use it when we can't return a reference to a true Ztring, const version
//---------------------------------------------------------------------------
 
//***************************************************************************
// Constructors/Destructor
//***************************************************************************
 
//---------------------------------------------------------------------------
// Constructors
InfoMap::InfoMap()
: std::multimap<ZenLib::Ztring, ZenLib::ZtringList> ()
{
    Separator[0]=EOL;
    Separator[1]=__T(";");
}
 
InfoMap::InfoMap(const Ztring &Source)
: std::multimap<ZenLib::Ztring, ZenLib::ZtringList> ()
{
    Separator[0]=EOL;
    Separator[1]=__T(";");
    Write(Source);
}
 
InfoMap::InfoMap(const Char *Source)
: std::multimap<ZenLib::Ztring, ZenLib::ZtringList> ()
{
    Separator[0]=EOL;
    Separator[1]=__T(";");
    Write(Source);
}
 
#ifdef _UNICODE
InfoMap::InfoMap (const char* S)
: std::multimap<ZenLib::Ztring, ZenLib::ZtringList> ()
{
    Separator[0]=EOL;
    Separator[1]=__T(";");
    Write(Ztring(S));
}
#endif
 
//***************************************************************************
// In/Out
//***************************************************************************
 
//---------------------------------------------------------------------------
const Ztring &InfoMap::Get (const Ztring &Value, size_t Pos) const
{
    InfoMap::const_iterator List=find(Value);
    if (List==end())
        return InfoMap_EmptyZtring_Const; //Not found
    if (Pos<List->second.size())
        return List->second[Pos];
    else
        return InfoMap_EmptyZtring_Const; //Not found
}
 
//---------------------------------------------------------------------------
const Ztring &InfoMap::Get (const Ztring &Value, size_t Pos, const Ztring &WithValue, size_t WithValue_Pos) const
{
    InfoMap::const_iterator List=find(Value);
    if (List==end())
        return InfoMap_EmptyZtring_Const; //Not found
    if (Pos<List->second.size())
    {
        if (List->second[WithValue_Pos]==WithValue)
            return List->second[Pos];
        else
        {
            ++List; //The second one, this is a stupid hack for a 2 value, should be changed later...
            if (List!=end() && Pos<List->second.size())
            {
                if (List->second[WithValue_Pos]==WithValue)
                    return List->second[Pos];
                else
                    return InfoMap_EmptyZtring_Const; //Not found
            }
            else
                return InfoMap_EmptyZtring_Const; //Not found
        }
    }
    else
        return InfoMap_EmptyZtring_Const; //Not found
}
 
//---------------------------------------------------------------------------
// Set
void InfoMap::Write(const Ztring &NewInfoMap)
{
    clear();
 
    if (NewInfoMap.empty())
        return;
 
    size_t Pos1=0, Pos2_EOL=0, Pos2_Separator=0;
 
    while (Pos2_EOL!=(size_t)-1)
    {
        Pos2_EOL=NewInfoMap.find(__T('\n'), Pos1);
        Pos2_Separator=NewInfoMap.find(__T(';'), Pos1);
        if (Pos2_Separator<Pos2_EOL)
        {
            ZtringList List; List.Write(NewInfoMap.substr(Pos1, Pos2_EOL-Pos1));
            insert (pair<Ztring, ZtringList>(NewInfoMap.substr(Pos1, Pos2_Separator-Pos1), List));
        }
        Pos1=Pos2_EOL+1;
    }
}
 
//***************************************************************************
// Configuration
//***************************************************************************
 
//---------------------------------------------------------------------------
// Separator
void InfoMap::Separator_Set (size_type Level, const Ztring &NewSeparator)
{
    if (Level>1)
        return;
 
    Separator[Level]=NewSeparator;
}
 
//***************************************************************************
// C++
//***************************************************************************
 
} //namespace

V730 Not all members of a class are initialized inside the constructor. Consider inspecting: Max.

V730 It is possible that not all members of a class are initialized inside the constructor. Consider inspecting: Max.

V730 It is possible that not all members of a class are initialized inside the constructor. Consider inspecting: Max.

V730 It is possible that not all members of a class are initialized inside the constructor. Consider inspecting: Max.