diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2022-02-24 15:22:56 +0100 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2022-02-24 15:22:56 +0100 |
| commit | f99a7b699a6169003fc8b56f652de44c2e834ca5 (patch) | |
| tree | e31450089bc2b8e9abf0d69659e665628395a2aa /src/base_tab/gamebase | |
| parent | 40c6df0e7c3f17204a6187eb2bc241f396720272 (diff) | |
Improve BaseTab pgn loading
Diffstat (limited to 'src/base_tab/gamebase')
| -rw-r--r-- | src/base_tab/gamebase/GameBase.hpp | 5 | ||||
| -rw-r--r-- | src/base_tab/gamebase/PGNGameBase.cpp | 61 | ||||
| -rw-r--r-- | src/base_tab/gamebase/PGNGameBase.hpp | 14 |
3 files changed, 50 insertions, 30 deletions
diff --git a/src/base_tab/gamebase/GameBase.hpp b/src/base_tab/gamebase/GameBase.hpp index 9982a7d..828248c 100644 --- a/src/base_tab/gamebase/GameBase.hpp +++ b/src/base_tab/gamebase/GameBase.hpp @@ -4,7 +4,8 @@ class GameBase { public: - virtual bool HasNextGame() = 0; virtual Game *GetGame(std::uint32_t id) = 0; - virtual Game *GetNextGame() = 0; + virtual bool NextGame() = 0; + virtual std::string GetTag(std::string tag) = 0; + virtual void Reset() = 0; };
\ No newline at end of file diff --git a/src/base_tab/gamebase/PGNGameBase.cpp b/src/base_tab/gamebase/PGNGameBase.cpp index 39775d1..08c8803 100644 --- a/src/base_tab/gamebase/PGNGameBase.cpp +++ b/src/base_tab/gamebase/PGNGameBase.cpp @@ -1,35 +1,54 @@ #include "PGNGameBase.hpp" -PGNGameBase::PGNGameBase(std::string pgn_file) - : pgn(new pgnp::PGN()), hasNextGame(false) { +PGNGameBase::PGNGameBase(std::string pgn_file) : pgn(new pgnp::PGN()) { + file = pgn_file; pgn->FromFile(pgn_file); - ParseNextGame(); } -bool PGNGameBase::HasNextGame() { return (hasNextGame); } - -void PGNGameBase::ParseNextGame() { +bool PGNGameBase::NextGame() { + bool game_found = false; try { pgn->ParseNextGame(); - hasNextGame = true; + game_found = true; } catch (...) { - hasNextGame = false; + game_found = false; } + return (game_found); } -Game *PGNGameBase::GetNextGame() { - pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); - pgn->GetMoves(pgnp_moves); - std::string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; - if (pgn->HasTag("FEN")) { - fen = pgn->GetTagValue("FEN"); - } - HalfMove *m = new HalfMove(pgnp_moves, fen); - Game *g = new Game(m, fen); - for (std::string &s : pgn->GetTagList()) { - g->SetTag(s, pgn->GetTagValue(s)); +std::string PGNGameBase::GetTag(std::string tag) { + if (pgn->HasTag(tag)) { + return (pgn->GetTagValue(tag)); } + return (""); +} - ParseNextGame(); - return (g); +void PGNGameBase::Reset() { + delete pgn; + pgn = new pgnp::PGN(); + pgn->FromFile(file); +} + +Game *PGNGameBase::GetGame(std::uint32_t id) { + Reset(); + std::uint32_t curid = 0; + while(NextGame()) { + if (id == curid) { + pgnp::HalfMove *pgnp_moves = new pgnp::HalfMove(); + pgn->GetMoves(pgnp_moves); + std::string fen = + "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1"; + if (pgn->HasTag("FEN")) { + fen = pgn->GetTagValue("FEN"); + } + HalfMove *m = new HalfMove(pgnp_moves, fen); + Game *g = new Game(m, fen); + for (std::string &s : pgn->GetTagList()) { + g->SetTag(s, pgn->GetTagValue(s)); + } + return (g); + } + curid++; + } + return (NULL); } diff --git a/src/base_tab/gamebase/PGNGameBase.hpp b/src/base_tab/gamebase/PGNGameBase.hpp index b58bdca..1ad58a1 100644 --- a/src/base_tab/gamebase/PGNGameBase.hpp +++ b/src/base_tab/gamebase/PGNGameBase.hpp @@ -2,14 +2,14 @@ #include "pgnp.hpp" class PGNGameBase : public GameBase { - pgnp::PGN *pgn; - bool hasNextGame; + pgnp::PGN *pgn; + bool hasNextGame; + std::string file; - void ParseNextGame(); public: PGNGameBase(std::string pgn_file); - - bool HasNextGame(); - Game *GetGame(std::uint32_t id) { return (new Game()); }; - Game *GetNextGame(); + Game *GetGame(std::uint32_t id); + bool NextGame(); + std::string GetTag(std::string tag); + void Reset(); };
\ No newline at end of file |
