/*
 * tkresolver
 *
 * Copyright (C) 2004-2007 Robert Ham <rah@bash.sh>
 *
 * GPL
 *
 */

#ifndef __TK_STRING_H__
#define __TK_STRING_H__

#include <wchar.h>

#include <string>
#include <sstream>

#include <glibmm.h>
#include <gmpxx.h>

#include "mbs.h"

namespace TkResolver {

  class TkString : public std::wstring
    {
    public:
      TkString() {}
      TkString(const wchar_t * wstr)
	: std::wstring(wstr) {}
      TkString(const char * str)
	: std::wstring(mbs_to_wstring(str)) {}
      TkString(const std::wstring & wstr)
	: std::wstring(wstr) {}
      TkString(const std::string & sstr)
	: std::wstring(string_to_wstring(sstr)) {}
      TkString(const Glib::ustring & ustr)
	: std::wstring(ustring_to_wstring(ustr)) {}
      TkString(long long i)
	{ std::wostringstream o; o << i; *this = o.str(); }
      TkString(const mpz_class &z)
	{ std::ostringstream o; o << z; *this = o.str(); }
      TkString(const mpf_class &f, unsigned long precision = 100)
	{ std::ostringstream o; o.precision(precision); o << f; *this = o.str(); }
      TkString(const mpq_class &q)
	{ *this = TkString(static_cast<mpf_class>(q)); }
      
      TkString & operator= (const wchar_t * wstr)
	{ return *this = TkString(wstr); }
      TkString & operator= (const char * str)
	{ return *this = TkString(str); }
      TkString & operator= (const std::string & sstr)
	{ return *this = string_to_wstring(sstr); }
      TkString & operator= (const Glib::ustring & ustr)
	{ return *this = ustring_to_wstring(ustr); }
      
      operator std::string() const
	{ return wstring_to_string(*this); }
      operator Glib::ustring() const
	{ return wstring_to_ustring(*this); }
    };

  typedef std::list<TkString> TkStringList;

}; /* namespace TkResolver */


#endif /* __TK_STRING_H__ */
