// -*- mode: c++ -*-
#ifndef MiX_DEFAULTXMLTRAITS_H_
#define MiX_DEFAULTXMLTRAITS_H_

// Adlib/DefaultXMLTraits.h
// (C) Copyright KUBO,Yotaro.
// [バージョン履歴]
// 0.4.7
//   - DefaultXMLTraits.cppのIncludeGuardマクロ名の変更
#include <string>
#include "config.h"

namespace MiX{

  template <class charT,class char_traits>
  class DefaultXMLTraits{
  public:
    typedef std::basic_string<charT,char_traits> basic_string_type;
  private:
    static basic_string_type makeString(const char* szSrc);

  public:
    ///文字列の終わりをあらわす文字を返します
    static charT null(){ return static_cast<charT>('\0'); }
    ///行の終わりをあらわす文字を返します
    static charT crlf(){ return static_cast<charT>('\n'); }
    ///空白文字を返します
    static charT sp(){ return static_cast<charT>(' '); }
    ///タブを返します
    static charT tab(){ return static_cast<charT>('\t'); }

    ///'<'に相当する文字を返します
    static charT lt(){ return static_cast<charT>('<'); }
    ///'='に相当する文字を返します
    static charT eq(){ return static_cast<charT>('='); }
    ///'>'に相当する文字を返します
    static charT gt(){ return static_cast<charT>('>'); }

    ///'/'に相当する文字を返します
    static charT slash(){ return static_cast<charT>('/'); }
    ///'-'に相当する文字を返します
    static charT hyphen(){ return static_cast<charT>('-'); }
    ///':'に相当する文字を返します
    static charT colon() { return static_cast<charT>(':'); }
    ///';'に相当する文字を返します
    static charT semicolon(){ return static_cast<charT>(';'); }

    ///'!'に相当する文字を返します
    static charT exclamation(){ return static_cast<charT>('!'); }
    ///'?'に相当する文字を返します
    static charT question(){ return static_cast<charT>('?'); }
    ///'&'に相当する文字を返します
    static charT amp(){ return static_cast<charT>('&'); }

    ///'\"'に相当する文字を返します
    static charT dblquote() { return static_cast<charT>('\"'); }
    ///'\''に相当する文字を返します
    static charT quote() { return static_cast<charT>('\''); }

    //文字列処理
    //XML文書中で使われる文字列を返す。
    ///"xml"に相当する文字列を返します
    static basic_string_type xml(){ 
      return makeString("xml");
    }
    ///"CDATA"に相当する文字列を返します
    static basic_string_type cdata(){
      return makeString("CDATA");
    }
    ///"lt"に相当する文字列を返します
    static basic_string_type str_lt(){
      return makeString("lt");
    }
    ///"gt"に相当する文字列を返します
    static basic_string_type str_gt(){
      return makeString("gt");
    }
    ///"amp"に相当する文字列を返します
    static basic_string_type str_amp(){
      return makeString("amp");
    }
    ///"quot"に相当する文字列を返します
    static basic_string_type str_quot(){
      return makeString("quot");
    }
    ///"apos"に相当する文字列を返します
    static basic_string_type str_apos(){
      return makeString("apos");
    }

    ///"xmlns"に相当する文字列を返します
    static basic_string_type str_xmlns(){ 
      return makeString("xmlns");
    }

    /**
     * 大文字小文字を区別しない比較を行います
     *
     * s1とs2をn文字目まで比べ、
     * s1>s2のときはは正の値
     * s1==s2のときは0
     * s1<s2のときは負の値を返します
     */
    static int ci_compare(const charT* s1,const charT* s2,size_t n){
      for(size_t i=0;i<n;i++){
	int c1,c2;
	c1 = std::tolower(static_cast<int>(s1[i]));
	c2 = std::tolower(static_cast<int>(s2[i]));
	if(c1>c2) return 1;
	if(c1<c2) return -1;
      }
      return 0;
    }
    
  };
}

#ifndef MiX_DEFAULTXMLTRAITS_CPP_
#include "DefaultXMLTraits.cpp"
#endif

#endif
