AM Daemon ライブラリリファレンス
InputOutputId.h
[詳解]
1 /// @file
2 /// @brief 抽象入出力の識別ID構造体テンプレート InputOutputId のヘッダ。
3 ///
4 /// Copyright(C)SEGA
5 
6 #ifndef AMDAEMON_INPUTOUTPUTID_H
7 #define AMDAEMON_INPUTOUTPUTID_H
8 
9 #include "amdaemon/env.h"
10 
11 #include <string>
12 #include <cstddef>
13 #include <cwchar>
14 
15 namespace amdaemon
16 {
17  namespace detail
18  {
19  /// InputOutputId 構造体内部値の最大サイズ。
20  static const std::size_t InputOutputIdValueSize = 23 + 1;
21 
22  /// @brief InputOutputId 構造体の内部値を設定する。
23  /// @param[in] src 設定元の値。
24  /// @param[in] dest 設定先の値。
25  /// @note アプリ側で直接利用することはない。
27  const wchar_t* src,
28  wchar_t (&dest)[InputOutputIdValueSize]);
29  } // namespace detail
30 
31  /// @brief 抽象入出力の識別ID構造体テンプレート。
32  /// @tparam Tag 入力と出力を区別するためのタグ型。
33  /// @see InputId, OutputId
34  /// @note memcpy 可能。
35  ///
36  /// アプリではこのクラス型から typedef 定義した InputId 型および OutputId 型を用いる。
37  ///
38  /// @internal ライブラリ実装メモ: この型を直接共有メモリに配置する。
39  template<class Tag>
41  {
42  /// 内部値の最大文字数。終端文字を含む。
43  static const std::size_t MaxSize = ::amdaemon::detail::InputOutputIdValueSize;
44 
45  wchar_t value[MaxSize]; ///< 内部値。
46 
47  /// @brief 識別IDインスタンスを作成する。
48  /// @param[in] value 識別IDの基となる文字列。
49  /// @return 識別IDインスタンス。
50  ///
51  /// @exception Exception
52  /// - 引数 value に nullptr を指定した場合。
53  /// - 引数 value の文字列長が MaxSize 以上である場合。
54  static InputOutputId make(const wchar_t* value)
55  {
56  InputOutputId id = { };
57  ::amdaemon::detail::makeInputOutputIdValue(value, id.value);
58  return id;
59  }
60 
61  /// @brief 識別IDインスタンスを作成する。
62  /// @tparam Traits 文字列型の traits_type 。引数から推論される。
63  /// @tparam Allocator 文字列型の allocator_type 。引数から推論される。
64  /// @param[in] value 識別IDの基となる文字列。
65  /// @return 識別IDインスタンス。
66  ///
67  /// @exception Exception
68  /// 引数 value の文字列長が MaxSize 以上である場合。
69  template<class Traits, class Allocator>
71  const std::basic_string<wchar_t, Traits, Allocator>& value)
72  {
73  InputOutputId id = { };
74  ::amdaemon::detail::makeInputOutputIdValue(value.c_str(), id.value);
75  return id;
76  }
77 
78  /// @brief 識別IDが空であるか否かを取得する。
79  /// @retval true 空である場合。
80  /// @retval false 空ではない場合。
81  bool empty() const
82  {
83  return (value[0] == L'¥0');
84  }
85 
86  /// 等価比較演算子のオーバロード。
87  friend bool operator==(const InputOutputId& l, const InputOutputId& r)
88  {
89  return (std::wcsncmp(l.value, r.value, MaxSize) == 0);
90  }
91 
92  /// 非等価比較演算子のオーバロード。
93  friend bool operator!=(const InputOutputId& l, const InputOutputId& r)
94  {
95  return !(l == r);
96  }
97 
98  /// 小なり比較演算子のオーバロード。
99  friend bool operator<(const InputOutputId& l, const InputOutputId& r)
100  {
101  return (std::wcsncmp(l.value, r.value, MaxSize) < 0);
102  }
103 
104  /// 大なり比較演算子のオーバロード。
105  friend bool operator>(const InputOutputId& l, const InputOutputId& r)
106  {
107  return (r < l);
108  }
109 
110  /// 小なり等価比較演算子のオーバロード。
111  friend bool operator<=(const InputOutputId& l, const InputOutputId& r)
112  {
113  return !(r < l);
114  }
115 
116  /// 大なり等価比較演算子のオーバロード。
117  friend bool operator>=(const InputOutputId& l, const InputOutputId& r)
118  {
119  return !(l < r);
120  }
121  };
122 }
123 
124 namespace std
125 {
126  // 前方宣言
127  template<class T> struct hash;
128 
129  /// @brief ハッシュ値を求めるファンクタ構造体。
130  /// @tparam Tag 入力と出力を区別するためのタグ型。
131  ///
132  /// std::hash クラステンプレートの
133  /// amdaemon::InputOutputId クラステンプレートに対する部分特殊化。
134  template<class Tag>
135  struct hash< ::amdaemon::InputOutputId<Tag> >
136  {
137  /// 戻り値の型。
138  typedef hash<wstring>::result_type result_type;
139 
140  /// 引数の型。
141  typedef ::amdaemon::InputOutputId<Tag> argument_type;
142 
143  /// @brief 引数のハッシュ値を取得する。
144  /// @param[in] id 引数。
145  /// @return ハッシュ値。
146  result_type operator()(const argument_type& id) const
147  {
148  return hash<wstring>()(id.value);
149  }
150  };
151 } // namespace std
152 
153 #endif // AMDAEMON_INPUTOUTPUTID_H
::amdaemon::InputOutputId< Tag > argument_type
引数の型。
Definition: InputOutputId.h:141
friend bool operator>(const InputOutputId &l, const InputOutputId &r)
大なり比較演算子のオーバロード。
Definition: InputOutputId.h:105
bool empty() const
識別IDが空であるか否かを取得する。
Definition: InputOutputId.h:81
static const std::size_t InputOutputIdValueSize
InputOutputId 構造体内部値の最大サイズ。
Definition: InputOutputId.h:20
Definition: AccessCode.h:202
static InputOutputId make(const std::basic_string< wchar_t, Traits, Allocator > &value)
識別IDインスタンスを作成する。
Definition: InputOutputId.h:70
Daemonライブラリの環境定義を行うヘッダ。
friend bool operator<=(const InputOutputId &l, const InputOutputId &r)
小なり等価比較演算子のオーバロード。
Definition: InputOutputId.h:111
AM Daemon ライブラリクラス群の基底名前空間。
Definition: Log.h:13
friend bool operator<(const InputOutputId &l, const InputOutputId &r)
小なり比較演算子のオーバロード。
Definition: InputOutputId.h:99
friend bool operator>=(const InputOutputId &l, const InputOutputId &r)
大なり等価比較演算子のオーバロード。
Definition: InputOutputId.h:117
result_type operator()(const argument_type &id) const
引数のハッシュ値を取得する。
Definition: InputOutputId.h:146
hash< wstring >::result_type result_type
戻り値の型。
Definition: InputOutputId.h:138
抽象入出力の識別ID構造体テンプレート。
Definition: InputOutputId.h:40
friend bool operator!=(const InputOutputId &l, const InputOutputId &r)
非等価比較演算子のオーバロード。
Definition: InputOutputId.h:93
void makeInputOutputIdValue(const wchar_t *src, wchar_t(&dest)[InputOutputIdValueSize])
InputOutputId 構造体の内部値を設定する。
wchar_t value[MaxSize]
内部値。
Definition: InputOutputId.h:45
static InputOutputId make(const wchar_t *value)
識別IDインスタンスを作成する。
Definition: InputOutputId.h:54
friend bool operator==(const InputOutputId &l, const InputOutputId &r)
等価比較演算子のオーバロード。
Definition: InputOutputId.h:87