//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * コンフィグレーションファイルヘッダ
 * @author Junpee
 */

#ifndef CONFIGURATION_FILE_H_
#define CONFIGURATION_FILE_H_

#include <Core/Container/HashMap.h>

namespace Lamp{

//------------------------------------------------------------------------------
/**
 * コンフィグレーションファイル
 */
class ConfigurationFile{
public:
	/**
	 * コンストラクタ
	 * @param fileName ロードするコンフィグファイル名
	 */
	explicit ConfigurationFile(const String& fileName);

	/**
	 * デストラクタ
	 */
	virtual ~ConfigurationFile();

	/**
	 * データ数の取得
	 */
	virtual int getCount() const{ return database_.getCount(); }

	/**
	 * charデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] char化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getChar(const String& key, char* value) const;

	/**
	 * u_charデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] u_char化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getUChar(const String& key, u_char* value) const;

	/**
	 * shortデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] short化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getShort(const String& key, short* value) const;

	/**
	 * u_shortデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] u_short化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getUShort(const String& key, u_short* value) const;

	/**
	 * intデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] int化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getInt(const String& key, int* value) const;

	/**
	 * u_intデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] u_int化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getUInt(const String& key, u_int* value) const;

	/**
	 * floatデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] float化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getFloat(const String& key, float* value) const;

	/**
	 * doubleデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] double化された値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getDouble(const String& key, double* value) const;

	/**
	 * Stringデータの取得
	 * @param key 取得するデータのキー
	 * @param value [out] String値が代入されます
	 * @return trueならデータの取得に成功
	 */
	virtual bool getString(const String& key, String* value) const;

private:
	/**
	 * ロード
	 * @param fileName ロードするコンフィグファイル名
	 */
	virtual void load(const String& fileName);

	/**
	 * データの追加
	 * @param key 追加するデータのキー
	 * @param value 追加するデータ
	 */
	virtual void add(const String& key, const String& value);

	// コピーコンストラクタの隠蔽
	ConfigurationFile(const ConfigurationFile& copy);

	// 代入コピーの隠蔽
	void operator =(const ConfigurationFile& copy);

	// ファイル名
	String fileName_;
	// データベース
	HashMap<String, String> database_;
};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of CONFIGURATION_FILE_H_
//------------------------------------------------------------------------------
