CTR-Pia  5.4.3
Game Communication Engine
 全て クラス ネームスペース 関数 変数 型定義 列挙型 列挙型の値 ページ
clone_EventCloneElement.h
1 /*--------------------------------------------------------------------------------*
2  Copyright (C)Nintendo All rights reserved.
3 
4  These coded instructions, statements, and computer programs contain proprietary
5  information of Nintendo and/or its licensed developers and are protected by
6  national and international copyright laws. They may not be disclosed to third
7  parties or copied or duplicated in any form, in whole or in part, without the
8  prior written consent of Nintendo.
9 
10  The content herein is highly confidential and should be handled accordingly.
11  *--------------------------------------------------------------------------------*/
12 
13 
14 #pragma once
15 
16 #include <nn/pia/clone/clone_Definitions.h>
17 #include <nn/pia/clone/clone_EventCloneElementBase.h>
18 #include <nn/pia/clone/clone_SerializePolicyDefinition.h>
19 
20 namespace nn
21 {
22 namespace pia
23 {
24 namespace clone
25 {
26 
27 
28 /*!
29  @brief イベントの送受信を管理します。
30 
31  @tparam Value_ イベント発行時に指定する値の型です。値が必要ない場合でも何らかの値を設定する必要があります。
32  @tparam BufferSize イベントバッファのサイズです。正の値を指定する必要があります。
33  */
34 template <typename Value_, uint32_t BufferSize>
36 {
37 public:
38  /*!
39  @brief このイベントで送られる引数の型です。
40  */
41  typedef Value_ Value;
42 
43  /*!
44  @brief Value をシリアライズするためのアルゴリズムです。
45  */
47 
48 
49  /*!
50  @brief デフォルトコンストラクタです。
51  */
53 
54 
55  /*!
56  @brief デストラクタです。
57  */
59  {
60  }
61 
62 
63  /*!
64  @brief イベントを発行します。
65  @param[in] value イベントの値です。
66  @return 成功すれば、IsSuccess() が true を返す Result が返されます。
67  @retval ResultInvalidState 登録しているクローンが送信可能状態ではありません。プログラミングエラーです。このエラーが返らないようにソースコードを修正してください。
68  @retval ResultBufferIsFull バッファがいっぱいで発行できません。アプリケーションで適切にハンドリングしてください。
69  */
70  Result SetValue(const Value& value);
71 
72 
73  /*!
74  @brief 次のイベントを参照します。
75  @details 参照中のイベントは、もう一度 HandleNext() を呼ぶまで同じものが参照できます。
76  @return 新たに参照するイベントの値です。次のイベントが無い場合は NULL を返します。
77  */
78  const Value* HandleNext()
79  {
80  HandleNextCore();
81  return GetValue();
82  }
83 
84 
85  /*!
86  @brief 現在参照中のイベントの値を指すポインタを取得します。
87  @return 現在参照中のイベントの値を指すポインタです。前回呼んだ HandleNext() の返り値と同じです。参照中のイベントが無い場合は NULL を返します。
88  */
89  const Value* GetValue() const
90  {
91  return (GetHandlingEventToken() != NULL) ? &(static_cast<const EventToken*>(GetHandlingEventToken())->GetValue()) : NULL;
92  }
93 
94 
95  /*!
96  @brief 現在参照中のイベントの発行時刻を取得します。
97  @return 現在参照中のイベントの発行時刻です。参照中のイベントが無い場合は @ref InvalidClock を返します。
98  */
100  {
101  return (GetHandlingEventToken() != NULL) ? GetHandlingEventToken()->GetClock() : InvalidClock;
102  }
103 
104 
105  /*!
106  @brief 現在参照中のイベントの発行元ステーションインデックスを取得します。
107  @return 現在参照中のイベントの発行元ステーションインデックスです。参照中のイベントが無い場合は StationIndex_Invalid を返します。
108  */
110  {
111  return (GetHandlingEventToken() != NULL) ? GetHandlingEventToken()->GetSetterStationIndex() : StationIndex_Invalid;
112  }
113 
114 
115  /*!
116  @brief 現在参照中のイベントのインデックスを取得します。
117  @return 現在参照中のイベントのインデックスです。参照中のイベントが無い場合は 0 を返します。
118  */
119  Index GetEventIndex() const
120  {
121  return (GetHandlingEventToken() != NULL) ? GetHandlingEventToken()->GetIndex() : 0;
122  }
123 
124 protected:
125  virtual uint32_t GetSize() const
126  {
128  }
129 
130 
131 private:
132  class EventToken : public EventTokenBase
133  {
134  public:
135  EventToken()
136  : EventTokenBase(), m_Value()
137  {
138  }
139  void SetValue(const Value& value)
140  {
141  m_Value = value;
142  }
143  const Value& GetValue() const
144  {
145  return m_Value;
146  }
147 
148  virtual void Serialize(void* pBuffer) const
149  {
150  ValueSerializePolicy::Serialize(pBuffer, m_Value);
151  }
152 
153  virtual void Deserialize(const void* cpBuffer)
154  {
155  ValueSerializePolicy::Deserialize(&m_Value, cpBuffer);
156  }
157 
158  private:
159  Value m_Value;
160  };
161 
162 
163  class EventTokenBuffer : public EventTokenBufferBase
164  {
165  public:
166  explicit EventTokenBuffer(EventCloneElementBase* pElement);
167 
168  protected:
169  virtual EventTokenBase* At(int idx)
170  {
171  return &m_EventTokenArray[idx];
172  }
173  virtual const EventTokenBase* At(int idx) const
174  {
175  return &m_EventTokenArray[idx];
176  }
177 
178  private:
179  EventToken m_EventTokenArray[BufferSize];
180  };
181 
182 
183  EventTokenBuffer m_EventTokenBuffer;
184  NN_PIA_DISALLOW_COPY(EventCloneElement);
185 };
186 
187 
188 //! @cond
189 NN_PIA_PRAGMA_PUSH_WARNINGS
190 NN_PIA_DISABLE_WARNING_WIN_4355 //n2219:memo C4355の warning を抑制開始 コンストラクタでのthisの使用
191 
192 template <typename Value, uint32_t BufferSize>
194  : EventCloneElementBase(&m_EventTokenBuffer),
195  m_EventTokenBuffer(this)
196 {
197  PIA_COMPILE_ASSERT(BufferSize >= BufferSizeMin && BufferSize <= BufferSizeMax);
198 }
199 
200 NN_PIA_PRAGMA_POP_WARNINGS //n2219:memo warning を抑制終了
201 
202 
203 template <typename Value, uint32_t BufferSize>
204 Result EventCloneElement<Value, BufferSize>::SetValue(const Value& value)
205 {
206  EventTokenBase* pTokenBase;
207  Result r = SetValueCore(&pTokenBase);
208  if (r.IsSuccess() && pTokenBase != NULL)
209  {
210  EventToken* pToken = static_cast<EventToken*>(pTokenBase);
211  pToken->SetValue(value);
212  }
213  return r;
214 }
215 
216 
217 template <typename Value, uint32_t BufferSize>
218 EventCloneElement<Value, BufferSize>::EventTokenBuffer::EventTokenBuffer(EventCloneElementBase* pElement)
219  : EventTokenBufferBase(BufferSize)
220 {
221  for (uint32_t i = 0; i < BufferSize; ++i)
222  {
223  m_EventTokenArray[i].Init(pElement);
224  m_EventTokenArray[i].SetState(EventTokenBase::State_EventTokenEmpty);
225  m_EventTokenArray[i].SetIndex(static_cast<Index>(i));
226  }
227 }
228 
229 //! @endcond
230 }
231 }
232 } // end of namespace nn::pia::clone