102. 文字種別に関するテンプレート(オリジナル)

102.1 文字種別の判定

次のメタ関数は、<cctype> ヘッダで宣言されている文字種判別関数と同じことを静的に行うためのものです。実装を簡単にするために、ここでは文字コードが ASCII 系(シフト JIS, EUC, UTF-8 などを含む)の場合に限定しています。

struct locale_C {};

template<int C, class L = locale_C>
struct is_digit
{
  static const bool value = ('0' <= C && C <= '9');
};

template<int C, class L = locale_C>
struct is_xdigit
{
  static const bool value
    = is_digit<C, L>::value
    | ('A' <= C && C <= 'F')
    | ('a' <= C && C <= 'f');
};

template<int C, class L = locale_C>
struct is_lower
{
  static const bool value = ('a' <= C && C <= 'z');
};

template<int C, class L = locale_C>
struct is_upper
{
  static const bool value = ('A' <= C && C <= 'Z');
};

template<int C, class L = locale_C>
struct is_alpha
{
  static const bool value
    = is_lower<C, L>::value | is_upper<C, L>::value;
};

template<int C, class L = locale_C>
struct is_alnum
{
  static const bool value
    = is_alpha<C, L>::value | is_digit<C, L>::value;
};

template<int C, class L = locale_C>
struct is_blank
{
  static const bool value = (C == ' ' || C == '\t');
};

template<int C, class L = locale_C>
struct is_space
{
  static const bool value
    = is_blank<C, L>::value
    | (C == '\f' || C == '\n' || C == '\r' || C == '\v');
};

template<int C, class L = locale_C>
struct is_graph
{
  static const bool value = (0x20 <= C && C <= 0x7e);
};

template<int C, class L = locale_C>
struct is_print
{
  static const bool value = is_graph<C, L>::value | (C == ' ');
};

template<int C, class L = locale_C>
struct is_punct
{
  static const bool value
    = is_graph<C, L>::value & !is_alnum<C, L>::value;
};

template<int C, class L = locale_C>
struct is_cntrl
{
  static const bool value
    = (0x00 <= C && C <= 0x1f || C == 0x7f);
};

第 2 テンプレート引数の L は、ロケールを指定するためのものです。デフォルトでは、"C" ロケールを意味する locale_C を指定しています。異なるロケールに対応する場合には、適当なロケールクラス(ユニークな型であれば何でもよい)でテンプレートの部分特殊化を行ってください。

102.2 大文字・小文字の変換

次のメタ関数は、<cctype> ヘッダで宣言されている大文字・小文字変換関数と同じことを静的に行うためのものです。実装を簡単にするために、ここでは文字コードが ASCII 系(シフト JIS, EUC, UTF-8 などを含む)の場合に限定しています。

template<char C, class L = locale_C>
struct to_lower
{
  static const char value
    = (is_upper<C, L>::value ? C - 'A' + 'a' : C);
};

template<char C, class L = locale_C>
struct to_upper
{
  static const char value
    = (is_lower<C, L>::value ? C - 'a' + 'A' : C);
};

第 2 テンプレート引数の L は、ロケールを指定するためのものです。デフォルトでは、"C" ロケールを意味する locale_C を指定しています。異なるロケールに対応する場合には、適当なロケールクラス(ユニークな型であれば何でもよい)でテンプレートの部分特殊化を行ってください

トラックバック


URL から "-nospam" を削除してトラックバックを送信してください。
このエントリーを含むはてなブックマーク