/*
* Quackle -- Crossword game artificial intelligence and analysis tool
* Copyright (C) 2005-2019 Jason Katz-Brown, John O'Laughlin, and John Fultz.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include
#include "catchall.h"
#include "computerplayer.h"
#include "datamanager.h"
#include "alphabetparameters.h"
#include "boardparameters.h"
#include "evaluator.h"
#include "catchall.h"
#include "gameparameters.h"
#include "lexiconparameters.h"
#include "strategyparameters.h"
#define QUACKLDEBUG
using namespace Quackle;
using namespace std;
DataManager *DataManager::m_self = 0;
DataManager::DataManager()
: m_evaluator(0), m_parameters(0), m_alphabetParameters(0), m_boardParameters(0), m_lexiconParameters(0), m_strategyParameters(0)
{
m_self = this;
setAppDataDirectory(".");
setUserDataDirectory(".");
seed_seq session_seed = {(unsigned) random_device{}(), (unsigned) time(nullptr)};
seedRandomNumbers(session_seed);
m_alphabetParameters = new EnglishAlphabetParameters;
m_evaluator = new CatchallEvaluator;
m_parameters = new EnglishParameters;
m_boardParameters = new EnglishBoard;
m_lexiconParameters = new LexiconParameters;
m_strategyParameters = new StrategyParameters;
}
DataManager::~DataManager()
{
delete m_evaluator;
delete m_parameters;
delete m_alphabetParameters;
delete m_boardParameters;
delete m_lexiconParameters;
delete m_strategyParameters;
cleanupComputerPlayers();
}
bool DataManager::isGood() const
{
return m_lexiconParameters->hasSomething();
}
void DataManager::setEvaluator(Evaluator *evaluator)
{
delete m_evaluator;
m_evaluator = evaluator;
}
void DataManager::setParameters(GameParameters *parameters)
{
delete m_parameters;
m_parameters = parameters;
}
void DataManager::setAlphabetParameters(AlphabetParameters *alphabetParameters)
{
delete m_alphabetParameters;
m_alphabetParameters = alphabetParameters;
}
void DataManager::setBoardParameters(BoardParameters *boardParameters)
{
delete m_boardParameters;
m_boardParameters = boardParameters;
}
void DataManager::setLexiconParameters(LexiconParameters *lexiconParameters)
{
delete m_lexiconParameters;
m_lexiconParameters = lexiconParameters;
}
void DataManager::setStrategyParameters(StrategyParameters *strategyParameters)
{
delete m_strategyParameters;
m_strategyParameters = strategyParameters;
}
void DataManager::setComputerPlayers(const PlayerList &playerList)
{
cleanupComputerPlayers();
m_computerPlayers = playerList;
}
void DataManager::cleanupComputerPlayers()
{
const PlayerList::iterator end(m_computerPlayers.end());
for (PlayerList::iterator it = m_computerPlayers.begin(); it != end; ++it)
delete (*it).computerPlayer();
m_computerPlayers.clear();
}
bool DataManager::fileExists(const string &filename)
{
// fixme: convert to wchar
struct stat buf;
int i = stat(filename.c_str(), &buf);
if (i == 0)
return true;
else
return false;
}
string DataManager::findDataFile(const string &subDirectory, const string &lexicon, const string &file)
{
string fname = makeDataFilename(subDirectory, lexicon, file, true);
if (!fileExists(fname))
fname = makeDataFilename(subDirectory, lexicon, file, false);
if (!fileExists(fname) && lexicon.substr(0,3) == "csw")
fname = makeDataFilename(subDirectory, "csw", file, false);
if (!fileExists(fname))
fname = makeDataFilename(subDirectory, m_backupLexicon, file, false);
if (!fileExists(fname))
fname = makeDataFilename(subDirectory, "default", file, false);
if (!fileExists(fname))
fname = string();
return fname;
}
string DataManager::findDataFile(const string &subDirectory, const string &file)
{
string fname = makeDataFilename(subDirectory, file, true);
if (!fileExists(fname))
fname = makeDataFilename(subDirectory, file, false);
if (!fileExists(fname))
fname = string();
return fname;
}
bool DataManager::hasUserDataFile(const string &subDirectory, const string &file)
{
string fname = makeDataFilename(subDirectory, file, true);
return fileExists(fname);
}
string DataManager::makeDataFilename(const string &subDirectory, const string &lexicon, const string &file, bool user)
{
return (user ? m_userDataDirectory : m_appDataDirectory) + "/" + subDirectory + "/" + lexicon + "/" + file;
}
string DataManager::makeDataFilename(const string &subDirectory, const string &file, bool user)
{
return (user ? m_userDataDirectory : m_appDataDirectory) + "/" + subDirectory + "/" + file;
}
void DataManager::seedRandomNumbers(unsigned int seed)
{
lock_guard lock(m_RngMutex);
m_mersenneTwisterRng.seed(seed);
}
void DataManager::seedRandomNumbers(seed_seq& seed)
{
lock_guard lock(m_RngMutex);
m_mersenneTwisterRng.seed(seed);
}
int DataManager::randomInteger(int low, int high)
{
lock_guard lock(m_RngMutex);
return uniform_int_distribution<>(low, high)(m_mersenneTwisterRng);
}