Android NDK-r5 設定ファイルを作成する

NDKを使うと、一時的な設定とかを保存するのが結構大変。
移植元のiPhoneソースコードなんかでは『NSUserDefaults』ってのがあったり
『NSMutableArray』なんかがあるのでこの辺を解消するのに時間かかりました。


簡単に書き終えれたらソース公開しちゃおうと思いましたが
かなり削ったのに合計で200行くらいになっちゃったので取り止め。
取り合えず設計思考だけメモ書きしとく。


取り合えず、データ保持用にstd::mapを2種類定義。
1つ目は std::map
2つ目は std::map>


これは、単純な変数を格納する場合とNSMutableArrayみたいな動きをさせるvector
区別するためだけど、まぁ、ちゃんとラッパークラスとか作ってやれば
こんなややこしくしなくてもよさそうではある。


まぁ、後はヘッダだけ書くとこんな感じか。

#include <map>
#include <string>
#include <vector>
#include <iostream>

// 設定用Map
typedef std::map<std::string, std::string> ConfigMap;
// 可変長配列
typedef std::vector<std::string> MutableArray;
// 可変長配列用のMap
typedef std::map<std::string, MutableArray> ConfigArrayMap;

class configUtil
{
private:
	// データ保持
	ConfigMap 		m_ConfigMap;
	ConfigArrayMap		m_ConfigArrayMap;
	std::string 		m_FilePath;
	std::string		m_FileArrayPath;

	configUtil();
	// デリミタ分割
	void tokenize(const std::string& input, MutableArray& result, const std::string& delim);
	std::string Find(std::string key);
public:
	// コンストラクタ生成時に、デフォルトマップ作成
	// ファイルを解析してmapを生成する
	configUtil(const char* filePath);
	// デストラクタでマップを解放する?
	~configUtil();

	// 情報取得(無ければ0が返る)
	template <typename T>
	void getConfig(std::string key, T& param);
	// vectorが保存されている場合がありうる
	void getConfigArray(std::string key, MutableArray& array);
	
	// 情報登録(keyが存在しなければ、生成)
	template <class T>
	void setConfig(std::string key, T& param);
	// vectorを保存する場合がありうる
	void setConfigArray(std::string key, MutableArray& array);
	
	// 登録情報を書き込み
	bool synchronize();
};

軽く解説しておくと、
コンストラクタでデータの保存できるフォルダパスを渡しておく。
このオブジェクト自体をいっぱい作ろうと思ったら、フォルダパスじゃなくてファイルパスか。


コンストラクタ内でファイルを開いて、std::mapに格納するわけだ。
可変長配列の方は、","でデリミタ分割する。


setConfig〜getConfigなどは全てstd::mapに対してアクセスし、
クラスが破棄される際や任意のタイミングでsynchronize()を実行することで更新。
templateがどうも、cpp側で関数定義後に

template void configUtil::getConfig<bool>(std::string key, bool& param);

こんな感じで利用する変数分定義しないとコンパイル通らないのが参った。
うあー。移植って大変すぎる。 全然作業進まないぜ。