Skip to content

Commit

Permalink
Refactor the whole TypeHandler OOP mess ; now much saner.
Browse files Browse the repository at this point in the history
  • Loading branch information
adriweb committed Sep 18, 2016
1 parent 43ca73b commit 9cb7405
Show file tree
Hide file tree
Showing 19 changed files with 102 additions and 311 deletions.
10 changes: 3 additions & 7 deletions src/TIVarFile.cpp
Expand Up @@ -8,9 +8,7 @@
#include "TIVarFile.h"
#include "utils.h"
#include "TIModels.h"
#include "TypeHandlers/TH_0x05.h"
#include "TypeHandlers/TH_0x00.h"
#include "TypeHandlers/TypeHandlerFuncGetter.h"
#include "TypeHandlers/TypeHandlers.h"
#include <regex>
#include <numeric>

Expand Down Expand Up @@ -238,8 +236,7 @@ namespace tivars

void TIVarFile::setContentFromString(const string str, const options_t options)
{
auto func = TypeHandlerFuncGetter::getDataFromStringFunc(this->type.getId());
this->varEntry.data = func(str, options);
this->varEntry.data = (this->type.getHandlers().first)(str, options);
this->refreshMetadataFields();
}

Expand All @@ -265,8 +262,7 @@ namespace tivars

string TIVarFile::getReadableContent(const options_t options)
{
auto func = TypeHandlerFuncGetter::getStringFromDataFunc(this->type.getId());
return func(this->varEntry.data, options);
return (this->type.getHandlers().second)(this->varEntry.data, options);
}

void TIVarFile::fixChecksumInFile()
Expand Down
14 changes: 3 additions & 11 deletions src/TIVarType.cpp
Expand Up @@ -8,7 +8,7 @@
#include "TIVarType.h"
#include "TIVarTypes.h"
#include "utils.h"
#include "TypeHandlers/TH_0x05.h"
#include "TypeHandlers/TypeHandlers.h"

using namespace std;

Expand All @@ -25,11 +25,7 @@ namespace tivars
{
if (TIVarTypes::isValidID(id))
{
TIVarType varType;
varType.id = id;
varType.exts = TIVarTypes::getExtensionsFromTypeID(id);
varType.name = TIVarTypes::getNameFromID(id);
return varType;
return types.at(to_string(id));
} else {
throw invalid_argument("Invalid type ID");
}
Expand All @@ -44,11 +40,7 @@ namespace tivars
{
if (TIVarTypes::isValidName(name))
{
TIVarType varType;
varType.name = name;
varType.id = TIVarTypes::getIDFromName(name);
varType.exts = TIVarTypes::getExtensionsFromName(name);
return varType;
return types.at(name);
} else {
throw invalid_argument("Invalid type name");
}
Expand Down
6 changes: 4 additions & 2 deletions src/TIVarType.h
Expand Up @@ -9,7 +9,7 @@
#define TIVARTYPE_H

#include "autoloader.h"
#include "TypeHandlers/ITIVarTypeHandler.h"
#include "TypeHandlers/DummyHandler.h"

namespace tivars
{
Expand All @@ -22,7 +22,7 @@ namespace tivars
TIVarType()
{}

TIVarType(int id, std::string name, std::vector<std::string> exts) : id(id), name(name), exts(exts)
TIVarType(int id, std::string name, std::vector<std::string> exts, handler_pair_t handlers) : id(id), name(name), exts(exts), handlers(handlers)
{}

~TIVarType()
Expand All @@ -32,6 +32,7 @@ namespace tivars
const int& getId() const { return this->id; }
const std::string& getName() const { return this->name; }
const std::vector<std::string>& getExts() const { return this->exts; }
const handler_pair_t& getHandlers() const { return this->handlers; };

/*** "Constructors" ***/
static TIVarType createFromID(uint id);
Expand All @@ -41,6 +42,7 @@ namespace tivars
int id = -1;
std::string name = "Unknown";
std::vector<std::string> exts;
handler_pair_t handlers;

};

Expand Down
25 changes: 14 additions & 11 deletions src/TIVarTypes.cpp
Expand Up @@ -9,6 +9,8 @@
#include "TIVarType.h"
#include "utils.h"

#include "TypeHandlers/TypeHandlers.h"

using namespace std;

namespace tivars
Expand All @@ -19,13 +21,14 @@ namespace tivars
/**
* Make and insert the associative arrays for the type.
*
* @param string name The name of the type
* @param int id The ID of the type
* @param array exts The extensions the type can have, ordered by feature flags.
* @param string name The name of the type
* @param int id The ID of the type
* @param vector exts The extensions the type can have, ordered by feature flags.
* @param pair handlers The data2str and str2data funcs
*/
void TIVarTypes::insertType(string name, int id, vector<string> exts)
void TIVarTypes::insertType(string name, int id, vector<string> exts, handler_pair_t handlers)
{
TIVarType varType(id, name, exts);
TIVarType varType(id, name, exts, handlers);

string id_str = to_string(id);
types[name] = varType;
Expand All @@ -45,13 +48,13 @@ namespace tivars
insertType("Unknown", -1, { "" , "" , "" , "" , "" , "" , "" });

/* Standard types */
insertType("Real", 0x00, {"82n", "83n", "8xn", "8xn", "8xn", "8xn", "8xn"});
insertType("RealList", 0x01, {"82l", "83l", "8xl", "8xl", "8xl", "8xl", "8xl"});
insertType("Real", 0x00, {"82n", "83n", "8xn", "8xn", "8xn", "8xn", "8xn"}, make_handler_pair(TH_0x00) );
insertType("RealList", 0x01, {"82l", "83l", "8xl", "8xl", "8xl", "8xl", "8xl"}, make_handler_pair(TH_0x01) );
insertType("Matrix", 0x02, {"82m", "83m", "8xm", "8xm", "8xm", "8xm", "8xm"});
insertType("Equation", 0x03, {"82y", "83y", "8xy", "8xy", "8xy", "8xy", "8xy"});
insertType("String", 0x04, {"82s", "83s", "8xs", "8xs", "8xs", "8xs", "8xs"});
insertType("Program", 0x05, {"82p", "83p", "8xp", "8xp", "8xp", "8xp", "8xp"});
insertType("ProtectedProgram", 0x06, {"82p", "83p", "8xp", "8xp", "8xp", "8xp", "8xp"});
insertType("Equation", 0x03, {"82y", "83y", "8xy", "8xy", "8xy", "8xy", "8xy"}, make_handler_pair(TH_0x03) );
insertType("String", 0x04, {"82s", "83s", "8xs", "8xs", "8xs", "8xs", "8xs"}, make_handler_pair(TH_0x04) );
insertType("Program", 0x05, {"82p", "83p", "8xp", "8xp", "8xp", "8xp", "8xp"}, make_handler_pair(TH_0x05) );
insertType("ProtectedProgram", 0x06, {"82p", "83p", "8xp", "8xp", "8xp", "8xp", "8xp"}, make_handler_pair(TH_0x06) );
insertType("Picture", 0x07, { "" , "" , "8xi", "8xi", "8ci", "8ci", "8ci"});
insertType("GraphDataBase", 0x08, {"82d", "83d", "8xd", "8xd", "8xd", "8xd", "8xd"});
// insertType("WindowSettings", 0x0B, {"82w", "83w", "8xw", "8xw", "8xw", "8xw", "8xw"});
Expand Down
6 changes: 5 additions & 1 deletion src/TIVarTypes.h
Expand Up @@ -9,9 +9,13 @@
#define TIVARTYPES_H

#include "autoloader.h"
#include "TIVarType.h"
#include "TypeHandlers/DummyHandler.h"

namespace tivars
{
extern std::unordered_map<std::string, TIVarType> types;

class TIVarTypes
{

Expand All @@ -28,7 +32,7 @@ namespace tivars
static std::string getNameFromID(int id);

private:
static void insertType(std::string name, int id, std::vector<std::string> exts);
static void insertType(std::string name, int id, std::vector<std::string> exts, handler_pair_t handlers = make_handler_pair(DummyHandler));

};
}
Expand Down
Expand Up @@ -5,14 +5,14 @@
* License: MIT
*/

#ifndef ITIVARTYPEHANDLER_H
#define ITIVARTYPEHANDLER_H
#ifndef DUMMY_HANDLER_H
#define DUMMY_HANDLER_H

#include "../autoloader.h"

namespace tivars
{
class ITIVarTypeHandler
class DummyHandler
{

public:
Expand All @@ -30,6 +30,13 @@ namespace tivars
}

};

typedef decltype(&DummyHandler::makeDataFromString) dataFromString_handler_t;
typedef decltype(&DummyHandler::makeStringFromData) stringFromData_handler_t;
typedef std::pair<dataFromString_handler_t, stringFromData_handler_t> handler_pair_t;

#define make_handler_pair(cls) make_pair(&cls::makeDataFromString, &cls::makeStringFromData)

}

#endif
4 changes: 2 additions & 2 deletions src/TypeHandlers/TH_0x00.cpp
Expand Up @@ -5,7 +5,7 @@
* License: MIT
*/

#include "TH_0x00.h"
#include "TypeHandlers.h"
#include "../utils.h"
#include <regex>

Expand All @@ -15,7 +15,7 @@ using namespace std;

namespace tivars
{

data_t TH_0x00::makeDataFromString(const string& str, const options_t options)
{
data_t data(TH_0x00::dataByteCount);
Expand Down
30 changes: 0 additions & 30 deletions src/TypeHandlers/TH_0x00.h

This file was deleted.

5 changes: 2 additions & 3 deletions src/TypeHandlers/TH_0x01.cpp
Expand Up @@ -5,8 +5,7 @@
* License: MIT
*/

#include "TH_0x00.h"
#include "TH_0x01.h"
#include "TypeHandlers.h"
#include "../utils.h"
#include <regex>

Expand Down Expand Up @@ -56,7 +55,7 @@ namespace tivars
size_t byteCount = data.size();
size_t numCount = (size_t) ((data[0] & 0xFF) + ((data[1] << 8) & 0xFF00));
if (byteCount < 2+TH_0x00::dataByteCount || ((byteCount - 2) % TH_0x00::dataByteCount != 0)
|| (numCount != (int)((byteCount - 2) / TH_0x00::dataByteCount)) || numCount > 999)
|| (numCount != (size_t)((byteCount - 2) / TH_0x00::dataByteCount)) || numCount > 999)
{
throw invalid_argument("Invalid data array. Needs to contain 2+" + to_string(TH_0x00::dataByteCount) + "*n bytes");
}
Expand Down
28 changes: 0 additions & 28 deletions src/TypeHandlers/TH_0x01.h

This file was deleted.

19 changes: 0 additions & 19 deletions src/TypeHandlers/TH_0x03.h

This file was deleted.

19 changes: 0 additions & 19 deletions src/TypeHandlers/TH_0x04.h

This file was deleted.

17 changes: 10 additions & 7 deletions src/TypeHandlers/TH_0x05.cpp
Expand Up @@ -5,7 +5,7 @@
* License: MIT
*/

#include "TH_0x05.h"
#include "TypeHandlers.h"
#include "../utils.h"
#include <fstream>
#include <regex>
Expand All @@ -15,11 +15,13 @@ using namespace std;

namespace tivars
{

std::unordered_map<uint, std::vector<std::string>> tokens_BytesToName;
std::unordered_map<std::string, uint> tokens_NameToBytes;
uchar lengthOfLongestTokenName;
std::vector<uchar> firstByteOfTwoByteTokens;
namespace TH_0x05
{
std::unordered_map<uint, std::vector<std::string>> tokens_BytesToName;
std::unordered_map<std::string, uint> tokens_NameToBytes;
uchar lengthOfLongestTokenName;
std::vector<uchar> firstByteOfTwoByteTokens;
}

data_t TH_0x05::makeDataFromString(const string& str, const options_t options)
{
Expand Down Expand Up @@ -59,7 +61,8 @@ namespace tivars
throw invalid_argument("Empty data array. Needs to contain at least 2 bytes (size fields)");
}

uint langIdx = (has_option(options, "lang") && options.at("lang") == LANG_FR) ? LANG_FR : LANG_EN;
enum { LANG_EN = 0, LANG_FR };
uint langIdx = (uint)((has_option(options, "lang") && options.at("lang") == LANG_FR) ? LANG_FR : LANG_EN);

int howManyBytes = (data[0] & 0xFF) + ((data[1] << 8) & 0xFF00);
if (howManyBytes != data.size() - 2)
Expand Down

0 comments on commit 9cb7405

Please sign in to comment.