//	ランダムアクセスなlist

#ifndef __MSL_RA_LIST_H__
#define __MSL_RA_LIST_H__

#include "mslcommon.h"

#include <string>
#include <list>
#include <map>

//namespace msl{
NSMSL_START

/////////////////////////////////////////////////

#define MYU_INFINITY_INDEX_MIN	'!'	//' ' <-- printfとかしたとき分かりづらい
#define MYU_INFINITY_INDEX_MAX	'~'

//	unlimited_idクラス
class unlimited_id
{
public:
	std::string val;
public:
	unlimited_id(){val=MYU_INFINITY_INDEX_MIN;}
	//CMyuInfinityIndex(CYukiItemId in){}

	//	++オペレータ
	unlimited_id operator ++(int){
		unlimited_id old;
		old.val = this->val;
		increment();
        return old;
    }

	//	インクリメント
	void increment(){
		int lastIndex = val.length()-1;
		if ( val[lastIndex] >= MYU_INFINITY_INDEX_MAX )
			val += MYU_INFINITY_INDEX_MIN;
		else
			val[lastIndex]++;
	}

	//	文字列値を取得
	const char* get_string(){ return val.c_str(); }
};

/////////////////////////////////////////////////

//	ランダムアクセス可能なlist
template<typename T> class ra_list_ //:public std::list<T>
{
protected:
	std::map<std::string,T> m_ary;	//	実際の配列

public:

};

/////////////////////////////////////////////////////

//	ランダムアクセス可能なlist
template<typename T> class ra_list : public std::list<T>
{
public:
	typedef std::list<T> _BASE_T;
	typedef iterator id_t;

	//ra_list::iterator tail(){ return rbegin().base(); }
	//ra_list::iterator last(){ return rbegin().base(); }
	iterator tail(){ return (--end()); }
	iterator last(){ return (--end()); }

	/////////////////////////////////////////////////////////////

	iterator push_front(const T& x){
		return insert(begin());
		/*_BASE_T::push_back(x);
		m_images.begin();*/
	}
	iterator push_back(const T& x){
		//return insert(rbegin().base());
		return insert(tail());
		/*_BASE_T::push_back(x);
		m_images.rbegin().base();*/
	}

	//////////////////////////////////////////////////////////////

	//	[]演算子
	T& operator[](const iterator &it){ return (*it); }

	//	get（operator[]と同じ）
	T& get(const iterator &it){ return operator[](it); }

	//	find（そのままイテレータを返す）
	iterator find(const iterator &it){ return it; }

	//////////////////////////////////////////////////////////////

	/*
	// positionの位置にxを挿入する。
	iterator insert(iterator position, const T& x){
	}
	// positionの位置にn個のx()を挿入する。
	void insert(iterator position, size_type n, const T& x);
	// positionの位置に[first, last)を挿入する。
	template <class InputIterator>
	  void insert(iterator position, InputIterator first, InputIterator last);

	// positionの位置にT()を挿入する。
	iterator insert(iterator position);
	// positionの位置に[first, last)を挿入する(非メンバテンプレート版)。
	void insert(iterator position, const T* first, const T* last);
	void insert(iterator position, const_iterator first, const_iterator last);

	///////////////////////////////////////////////////////////////////////

	// positionの要素を削除。
	iterator erase(iterator position);
	// [first, last)の要素を削除。
	iterator erase(iterator first, iterator last);
	// 全要素削除。
	void clear();

	//////////////////////////////////////////////////////////////////////

	splice()
	// positionの位置にxを接続
	void splice(iterator position, list<T, Allocator>& x);
	// positionの位置にiを接続(iは元のリストから切り離される)
	void splice(iterator position, list<T, Allocator>& x, iterator i);
	// positionの位置にfirst - lastを接続(first-lastは元のリストから切り離される)
	void splice(iterator position, list<T, Allocator>& x,
				iterator first, iterator last);
	*/
};


/////////////////////////////////////////////////

//	map+list
template<typename Key,typename T> class maplist
{
protected:
	std::list<T> m_list;
	std::map<Key,T*> m_map;

public:

};

/////////////////////////////////////////////////

NSMSL_END

#endif//__MSL_RA_LIST_H__
