
#ifndef DKUTIL_POLICY_ARRAY_TO_STRING_HPP
#define DKUTIL_POLICY_ARRAY_TO_STRING_HPP

#include <string>

namespace dkutil{

namespace policy{

template<typename T>
class array_to_string{
public:
	typedef typename T element_type;
	
	///ptrをstrlenしたものとptrsizeをくらべて短い方を取得する。
	inline size_t less_length(const element_type *ptr,size_t ptrsize){
		size_t i=0;
		while(ptr[i] != '\0'){
			i++;
			if(ptrsize <= i) break;
		}
		return i;
	}
	/**
	ptrをptrsizeまでの文字列とみなしてstd::stringにする。
	この条件から外れていたら例外を投げる
	*/
	inline std::string convert(const element_type *ptr,size_t ptrsize, bool isThrow=true)
	{	
		const char *error_str="array_to_string::convert function: cannot convert";
		std::string s;
		size_t i = 0;
		element_type e = 'a';
		size_t se = ptrsize;
		element_type x;
		for(;i<se;i++)
		{
			x = ptr[i];
			if('\0' == e && '\0'==x){
				if(isThrow)
				{
					DKUTIL_THROW_OR_NOTICE(std::runtime_error(error_str));
				}else{
					dkcmNOT_ASSERT(error_str);
				}
				goto End;
			}
			s += x;
			e = x;
		}
End:
		return s;	
	}
		
};

}//end of policy namespace

}//end of dkutil namespace



#endif
