@@ -261,6 +261,68 @@ class GameInfosetRep : public GameObject {
261261 iterator cend () const { return {m_infoset, (m_infoset) ? m_infoset->m_actions .size () : 0 }; }
262262 };
263263
264+ class Members {
265+ GameInfoset m_infoset{nullptr };
266+
267+ public:
268+ class iterator {
269+ GameInfoset m_infoset{nullptr };
270+ size_t m_index{0 };
271+
272+ public:
273+ using iterator_category = std::bidirectional_iterator_tag;
274+ using difference_type = std::ptrdiff_t ;
275+ using value_type = GameNode;
276+ using pointer = value_type *;
277+ using reference = value_type &;
278+
279+ iterator () = default ;
280+ iterator (const GameInfoset &p_infoset, size_t p_index = 0 )
281+ : m_infoset(p_infoset), m_index(p_index)
282+ {
283+ }
284+ iterator (const iterator &) = default ;
285+ ~iterator () = default ;
286+ iterator &operator =(const iterator &) = default ;
287+
288+ bool operator ==(const iterator &p_iter) const
289+ {
290+ return m_infoset == p_iter.m_infoset && m_index == p_iter.m_index ;
291+ }
292+ bool operator !=(const iterator &p_iter) const
293+ {
294+ return m_infoset != p_iter.m_infoset || m_index != p_iter.m_index ;
295+ }
296+
297+ iterator &operator ++()
298+ {
299+ m_index++;
300+ return *this ;
301+ }
302+ iterator &operator --()
303+ {
304+ m_index--;
305+ return *this ;
306+ }
307+ GameNode operator *() const { return m_infoset->m_members .at (m_index); }
308+ };
309+
310+ Members () = default ;
311+ explicit Members (const GameInfoset &p_infoset) : m_infoset(p_infoset) {}
312+ Members (const Members &) = default ;
313+ ~Members () = default ;
314+ Members &operator =(const Members &) = default ;
315+
316+ size_t size () const { return m_infoset->m_members .size (); }
317+ GameNode front () const { return m_infoset->m_members .front (); }
318+ GameNode back () const { return m_infoset->m_members .back (); }
319+
320+ iterator begin () const { return {m_infoset, 0 }; }
321+ iterator end () const { return {m_infoset, (m_infoset) ? m_infoset->m_members .size () : 0 }; }
322+ iterator cbegin () const { return {m_infoset, 0 }; }
323+ iterator cend () const { return {m_infoset, (m_infoset) ? m_infoset->m_members .size () : 0 }; }
324+ };
325+
264326 Game GetGame () const ;
265327 int GetNumber () const { return m_number; }
266328
@@ -280,8 +342,8 @@ class GameInfosetRep : public GameObject {
280342 // @}
281343
282344 size_t NumMembers () const { return m_members.size (); }
283- GameNode GetMember (int p_index) const ;
284- Array<GameNode> GetMembers () const ;
345+ GameNode GetMember (int p_index) const { return m_members. at (p_index - 1 ); }
346+ Members GetMembers () const { return Members ( this ); }
285347
286348 bool Precedes (GameNode) const ;
287349
@@ -922,6 +984,8 @@ inline void GameOutcomeRep::SetPayoff(const GamePlayer &p_player, const Number &
922984inline GamePlayer GameStrategyRep::GetPlayer () const { return m_player; }
923985
924986inline Game GameInfosetRep::GetGame () const { return m_game; }
987+ inline GamePlayer GameInfosetRep::GetPlayer () const { return m_player; }
988+ inline bool GameInfosetRep::IsChanceInfoset () const { return m_player->IsChance (); }
925989
926990inline Game GamePlayerRep::GetGame () const { return m_game; }
927991inline size_t GamePlayerRep::NumStrategies () const
0 commit comments