@@ -433,6 +433,63 @@ class GameRep : public BaseGameRep {
433433 // @}
434434
435435public:
436+ class Players {
437+ Game m_game{nullptr };
438+
439+ public:
440+ class iterator {
441+ Game m_game{nullptr };
442+ size_t m_index{0 };
443+
444+ public:
445+ using iterator_category = std::bidirectional_iterator_tag;
446+ using difference_type = std::ptrdiff_t ;
447+ using value_type = GamePlayer;
448+ using pointer = value_type *;
449+ using reference = value_type &;
450+
451+ iterator () = default ;
452+ iterator (const Game &p_game, size_t p_index = 0 ) : m_game(p_game), m_index(p_index) {}
453+ iterator (const iterator &) = default ;
454+ ~iterator () = default ;
455+ iterator &operator =(const iterator &) = default ;
456+
457+ bool operator ==(const iterator &p_iter) const
458+ {
459+ return m_game == p_iter.m_game && m_index == p_iter.m_index ;
460+ }
461+ bool operator !=(const iterator &p_iter) const
462+ {
463+ return m_game != p_iter.m_game || m_index != p_iter.m_index ;
464+ }
465+
466+ iterator &operator ++()
467+ {
468+ m_index++;
469+ return *this ;
470+ }
471+ iterator &operator --()
472+ {
473+ m_index--;
474+ return *this ;
475+ }
476+ GamePlayer operator *() const { return m_game->m_players .at (m_index); }
477+ };
478+
479+ Players () = default ;
480+ explicit Players (const Game &p_game) : m_game(p_game) {}
481+ Players (const Players &) = default ;
482+ ~Players () = default ;
483+ Players &operator =(const Players &) = default ;
484+
485+ size_t size () const { return m_game->m_players .size (); }
486+
487+ iterator begin () const { return {m_game, 0 }; }
488+ iterator end () const { return {m_game, (m_game) ? m_game->m_players .size () : 0 }; }
489+ iterator cbegin () const { return {m_game, 0 }; }
490+ iterator cend () const { return {m_game, (m_game) ? m_game->m_players .size () : 0 }; }
491+ };
492+
436493 // / @name Lifecycle
437494 // @{
438495 // / Clean up the game
@@ -599,7 +656,7 @@ class GameRep : public BaseGameRep {
599656 // / Returns the pl'th player in the game
600657 GamePlayer GetPlayer (int pl) const { return m_players.at (pl - 1 ); }
601658 // / Returns the set of players in the game
602- Array<GamePlayer> GetPlayers () const ;
659+ Players GetPlayers () const { return Players ( this ); }
603660 // / Returns the chance (nature) player
604661 virtual GamePlayer GetChance () const = 0;
605662 // / Creates a new player in the game, with no moves
0 commit comments