aboutsummaryrefslogtreecommitdiff
path: root/src/base_tab/gamebase
diff options
context:
space:
mode:
authorLoic Guegan <manzerbredes@mailbox.org>2022-02-24 15:22:56 +0100
committerLoic Guegan <manzerbredes@mailbox.org>2022-02-24 15:22:56 +0100
commitf99a7b699a6169003fc8b56f652de44c2e834ca5 (patch)
treee31450089bc2b8e9abf0d69659e665628395a2aa /src/base_tab/gamebase
parent40c6df0e7c3f17204a6187eb2bc241f396720272 (diff)
Improve BaseTab pgn loading
Diffstat (limited to 'src/base_tab/gamebase')
-rw-r--r--src/base_tab/gamebase/GameBase.hpp5
-rw-r--r--src/base_tab/gamebase/PGNGameBase.cpp61
-rw-r--r--src/base_tab/gamebase/PGNGameBase.hpp14
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