Skip to content
Snippets Groups Projects
Commit b537bc76 authored by vincent  lorrain's avatar vincent lorrain
Browse files

[NodeRegex][fix] mem leak

parent 10f48a1a
No related branches found
No related tags found
1 merge request!14Graph regex
...@@ -228,6 +228,17 @@ class ConditionalInterpreter ...@@ -228,6 +228,17 @@ class ConditionalInterpreter
* @see ConditionalRegisterFunction * @see ConditionalRegisterFunction
*/ */
ConditionalRegisterFunction mLambdaRegiter; ConditionalRegisterFunction mLambdaRegiter;
std::vector<ConditionalData*> mResolution ;
void clearRes(){
for (std::size_t i = 0; i < mResolution.size(); ++i) {
delete mResolution[i];
}
mResolution.clear();
}
public: public:
/** /**
...@@ -236,6 +247,8 @@ class ConditionalInterpreter ...@@ -236,6 +247,8 @@ class ConditionalInterpreter
*/ */
ConditionalInterpreter(const std::string ConditionalExpressions); ConditionalInterpreter(const std::string ConditionalExpressions);
~ConditionalInterpreter(){clearRes();}
/** /**
* @brief Test a node depending of the ConditionalExpressions * @brief Test a node depending of the ConditionalExpressions
...@@ -275,49 +288,49 @@ class ConditionalInterpreter ...@@ -275,49 +288,49 @@ class ConditionalInterpreter
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief Function that does something. * @brief Function that does something.
*/ */
std::vector<ConditionalData*> fLambda(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node,std::vector<ConditionalData*> datas); void fLambda(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief Converted the lexeme to a int and to ConditionalData* * @brief Converted the lexeme to a int and to ConditionalData*
*/ */
std::vector<ConditionalData*> fStrToInteger(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node); void fStrToInteger(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief Converted the lexeme to a float and to ConditionalData* * @brief Converted the lexeme to a float and to ConditionalData*
*/ */
std::vector<ConditionalData*> fStrToFloat(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node); void fStrToFloat(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief Converted the lexeme to a str and to ConditionalData* * @brief Converted the lexeme to a str and to ConditionalData*
*/ */
std::vector<ConditionalData*> fStrToStr(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node); void fStrToStr(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief makes the == operation between two previously converted ConditionalData* * @brief makes the == operation between two previously converted ConditionalData*
*/ */
std::vector<ConditionalData*> fEq(std::vector<ConditionalData*> datas); void fEq(void);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief makes the != operation between two previously converted ConditionalData* * @brief makes the != operation between two previously converted ConditionalData*
*/ */
std::vector<ConditionalData*> fNeq(std::vector<ConditionalData*> datas); void fNeq(void);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief makes the && operation between two previously converted ConditionalData* in bool * @brief makes the && operation between two previously converted ConditionalData* in bool
*/ */
std::vector<ConditionalData*> fAnd(std::vector<ConditionalData*> datas); void fAnd(void);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief makes the || operation between two previously converted ConditionalData* in bool * @brief makes the || operation between two previously converted ConditionalData* in bool
*/ */
std::vector<ConditionalData*> fOr(std::vector<ConditionalData*> datas); void fOr(void);
/** /**
* @ingroup ASTnodeInterpreterF * @ingroup ASTnodeInterpreterF
* @brief makes the ! operation * @brief makes the ! operation
*/ */
std::vector<ConditionalData*> fNot(std::vector<ConditionalData*> datas); void fNot(void);
}; };
......
...@@ -35,16 +35,18 @@ using namespace Aidge; ...@@ -35,16 +35,18 @@ using namespace Aidge;
bool ConditionalInterpreter::test( const NodePtr nodeOp) bool ConditionalInterpreter::test( const NodePtr nodeOp)
{ {
clearRes();
try{ try{
std::vector<ConditionalData*> r = visit({mTree},nodeOp); std::vector<ConditionalData*> r = visit({mTree},nodeOp);
if (r.size() != 1){ if (mResolution.size() != 1){
throw std::runtime_error("Multy output interpretation output"); throw std::runtime_error("Multy output interpretation output");
}else{ }else{
if (!r[0]->isTypeEqualTo<bool>()){ if (!mResolution[0]->isTypeEqualTo<bool>()){
throw std::runtime_error("TEST OUT MUST BE A BOOL "); throw std::runtime_error("TEST OUT MUST BE A BOOL ");
}else{ }else{
return r[0]->getValue<bool>(); return mResolution[0]->getValue<bool>();
} }
} }
...@@ -53,7 +55,6 @@ using namespace Aidge; ...@@ -53,7 +55,6 @@ using namespace Aidge;
errorMessage << "Error in test " << "\n\t" << e.what() << "\n"; errorMessage << "Error in test " << "\n\t" << e.what() << "\n";
throw std::runtime_error(errorMessage.str()); throw std::runtime_error(errorMessage.str());
} }
} }
void ConditionalInterpreter::insertLambda(const std::string key,std::function<bool(Aidge::NodePtr)> f){ void ConditionalInterpreter::insertLambda(const std::string key,std::function<bool(Aidge::NodePtr)> f){
...@@ -72,32 +73,33 @@ using namespace Aidge; ...@@ -72,32 +73,33 @@ using namespace Aidge;
/////////////////////////////////// ///////////////////////////////////
case ConditionalTokenTypes::NOT: case ConditionalTokenTypes::NOT:
{ {
std::vector<ConditionalData*> tmp = fNot(visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fNot();
} }
break; break;
case ConditionalTokenTypes::AND: case ConditionalTokenTypes::AND:
{ {
std::vector<ConditionalData*> tmp = fAnd(visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fAnd();
} }
break; break;
case ConditionalTokenTypes::OR: case ConditionalTokenTypes::OR:
{ {
std::vector<ConditionalData*> tmp = fOr(visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fOr();
} }
break; break;
case ConditionalTokenTypes::EQ: case ConditionalTokenTypes::EQ:
{ {
std::vector<ConditionalData*> tmp = fEq(visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fEq();
//dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
case ConditionalTokenTypes::NEQ: case ConditionalTokenTypes::NEQ:
{ {
std::vector<ConditionalData*> tmp = fNeq(visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fNeq();
} }
break; break;
...@@ -110,38 +112,36 @@ using namespace Aidge; ...@@ -110,38 +112,36 @@ using namespace Aidge;
break; break;
case ConditionalTokenTypes::INTEGER: case ConditionalTokenTypes::INTEGER:
{ {
std::vector<ConditionalData*> tmp = fStrToInteger(node); fStrToInteger(node);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
case ConditionalTokenTypes::FLOAT: case ConditionalTokenTypes::FLOAT:
{ {
std::vector<ConditionalData*> tmp = fStrToFloat(node); fStrToFloat(node);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
case ConditionalTokenTypes::STRING: case ConditionalTokenTypes::STRING:
{ {
std::vector<ConditionalData*> tmp = fStrToStr(node); fStrToStr(node);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
case ConditionalTokenTypes::NODE: //TODO case ConditionalTokenTypes::NODE: //TODO
{ {
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
data->setValue<NodePtr>(nodeOp); data->setValue<NodePtr>(nodeOp);
std::vector<ConditionalData*> tmp = {data}; mResolution.push_back(data);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
case ConditionalTokenTypes::LAMBDA: case ConditionalTokenTypes::LAMBDA:
{ {
std::vector<ConditionalData*> tmp = fLambda(node,visit(node->getChilds(),nodeOp)); visit(node->getChilds(),nodeOp);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end()); fLambda(node);
} }
break; break;
...@@ -154,9 +154,9 @@ using namespace Aidge; ...@@ -154,9 +154,9 @@ using namespace Aidge;
}else{ }else{
data->setValue<bool>(false); data->setValue<bool>(false);
} }
std::vector<ConditionalData*> tmp = {data}; mResolution.push_back(data);
dataVector.insert(dataVector.end(), tmp.begin(), tmp.end());
} }
break; break;
...@@ -183,68 +183,57 @@ using namespace Aidge; ...@@ -183,68 +183,57 @@ using namespace Aidge;
///////////////////// /////////////////////
std::vector<ConditionalData*> ConditionalInterpreter::fStrToInteger(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node) void ConditionalInterpreter::fStrToInteger(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node)
{ {
std::vector<ConditionalData*> dataVector;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
data->setValue<int>(std::stoi(node->getValue())); data->setValue<int>(std::stoi(node->getValue()));
dataVector.push_back(data); mResolution.push_back(data);
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fStrToFloat(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node) void ConditionalInterpreter::fStrToFloat(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node)
{ {
std::vector<ConditionalData*> dataVector;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
data->setValue<float>(std::stof(node->getValue())); data->setValue<float>(std::stof(node->getValue()));
dataVector.push_back(data); mResolution.push_back(data);
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fStrToStr(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node) void ConditionalInterpreter::fStrToStr(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node)
{ {
std::vector<ConditionalData*> dataVector;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
data->setValue<std::string>(node->getValue()); data->setValue<std::string>(node->getValue());
dataVector.push_back(data); mResolution.push_back(data);
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fLambda(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node,std::vector<ConditionalData*> datas) void ConditionalInterpreter::fLambda(const std::shared_ptr<AstNode<ConditionalTokenTypes>>& node)
{ {
//if the lambda have input //if the lambda have input
std::vector<ConditionalData*> dataVector;
ConditionalData* data; ConditionalData* data;
try { try {
data = mLambdaRegiter.run(node->getValue(),datas); data = mLambdaRegiter.run(node->getValue(),mResolution);
} catch (const std::exception& e) { } catch (const std::exception& e) {
std::ostringstream errorMessage; std::ostringstream errorMessage;
errorMessage << "Error in conditional interpretation when run the "<< node->getValue() <<" Lambda\n\t" << e.what() << "\n"; errorMessage << "Error in conditional interpretation when run the "<< node->getValue() <<" Lambda\n\t" << e.what() << "\n";
throw std::runtime_error(errorMessage.str()); throw std::runtime_error(errorMessage.str());
} }
dataVector.push_back(data);
clearRes();
//clear mResolution.push_back(data);
for (std::size_t i = 0; i < datas.size(); ++i) {
delete datas[i];
}
datas.clear();
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fEq(std::vector<ConditionalData*> datas) void ConditionalInterpreter::fEq(void)
{ {
if (datas.size() != 2){ if (mResolution.size() != 2){
throw std::runtime_error("EQ need 2 arg and get :" + datas.size()); throw std::runtime_error("EQ need 2 arg and get :" + mResolution.size());
} }
auto a = datas[0]; auto a = mResolution[0];
auto b = datas[1]; auto b = mResolution[1];
if (a->getType() != b->getType()){ if (a->getType() != b->getType()){
throw std::runtime_error("EQ Unsuported between type :" + a->getType() +" "+ b->getType()); throw std::runtime_error("EQ Unsuported between type :" + a->getType() +" "+ b->getType());
} }
std::vector<ConditionalData*> dataVector;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
...@@ -259,29 +248,23 @@ using namespace Aidge; ...@@ -259,29 +248,23 @@ using namespace Aidge;
}else{ }else{
throw std::runtime_error("EQ Unknown type encountered :" + a->getType() ); throw std::runtime_error("EQ Unknown type encountered :" + a->getType() );
} }
dataVector.push_back(data);
//clear clearRes();
for (std::size_t i = 0; i < datas.size(); ++i) { mResolution.push_back(data);
delete datas[i];
}
datas.clear();
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fNeq(std::vector<ConditionalData*> datas) void ConditionalInterpreter::fNeq(void)
{ {
if (datas.size() != 2){ if (mResolution.size() != 2){
throw std::runtime_error("NEQ need 2 arg and get :" + datas.size()); throw std::runtime_error("NEQ need 2 arg and get :" + mResolution.size());
} }
auto a = datas[0]; auto a = mResolution[0];
auto b = datas[1]; auto b = mResolution[1];
if (a->getType() != b->getType()){ if (a->getType() != b->getType()){
throw std::runtime_error("NEQ Unsuported between type :" + a->getType() +" "+ b->getType()); throw std::runtime_error("NEQ Unsuported between type :" + a->getType() +" "+ b->getType());
} }
std::vector<ConditionalData*> dataVector;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
if (a->isTypeEqualTo<int>()) { if (a->isTypeEqualTo<int>()) {
...@@ -294,24 +277,19 @@ using namespace Aidge; ...@@ -294,24 +277,19 @@ using namespace Aidge;
{ {
throw std::runtime_error("NEQ Unknown type encountered :" + a->getType() ); throw std::runtime_error("NEQ Unknown type encountered :" + a->getType() );
} }
dataVector.push_back(data);
//clear clearRes();
for (std::size_t i = 0; i < datas.size(); ++i) { mResolution.push_back(data);
delete datas[i];
}
datas.clear();
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fAnd(std::vector<ConditionalData*> datas) void ConditionalInterpreter::fAnd(void)
{ {
if (datas.size() != 2){ if (mResolution.size() != 2){
throw std::runtime_error("AND need 2 arg and get :" + datas.size()); throw std::runtime_error("AND need 2 arg and get :" + mResolution.size());
} }
auto a = datas[0]; auto a = mResolution[0];
auto b = datas[1]; auto b = mResolution[1];
std::vector<ConditionalData*> dataVector;
if (a->getType() != typeid(bool).name() || b->getType() != typeid(bool).name()){ if (a->getType() != typeid(bool).name() || b->getType() != typeid(bool).name()){
throw std::runtime_error("AND Unknown type encountered need bool get :" + a->getType() ); throw std::runtime_error("AND Unknown type encountered need bool get :" + a->getType() );
...@@ -321,24 +299,18 @@ using namespace Aidge; ...@@ -321,24 +299,18 @@ using namespace Aidge;
data->setValue<bool>( a->getValue<bool>() && b->getValue<bool>()); data->setValue<bool>( a->getValue<bool>() && b->getValue<bool>());
dataVector.push_back(data); clearRes();
//clear mResolution.push_back(data);
for (std::size_t i = 0; i < datas.size(); ++i) {
delete datas[i];
}
datas.clear();
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fOr(std::vector<ConditionalData*> datas) void ConditionalInterpreter::fOr(void)
{ {
if (datas.size() != 2){ if (mResolution.size() != 2){
throw std::runtime_error("OR need 2 arg and get :" + datas.size()); throw std::runtime_error("OR need 2 arg and get :" + mResolution.size());
} }
auto a = datas[0]; auto a = mResolution[0];
auto b = datas[1]; auto b = mResolution[1];
std::vector<ConditionalData*> dataVector;
if (a->getType() != typeid(bool).name() || b->getType() != typeid(bool).name()){ if (a->getType() != typeid(bool).name() || b->getType() != typeid(bool).name()){
throw std::runtime_error("OR Unknown type encountered need bool get :" + a->getType() ); throw std::runtime_error("OR Unknown type encountered need bool get :" + a->getType() );
...@@ -348,23 +320,16 @@ using namespace Aidge; ...@@ -348,23 +320,16 @@ using namespace Aidge;
data->setValue<bool>( a->getValue<bool>() || b->getValue<bool>()); data->setValue<bool>( a->getValue<bool>() || b->getValue<bool>());
dataVector.push_back(data); clearRes();
//clear mResolution.push_back(data);
for (std::size_t i = 0; i < datas.size(); ++i) {
delete datas[i];
}
datas.clear();
return dataVector;
} }
std::vector<ConditionalData*> ConditionalInterpreter::fNot(std::vector<ConditionalData*> datas) void ConditionalInterpreter::fNot()
{ {
if (datas.size() != 1){ if (mResolution.size() != 1){
throw std::runtime_error("not need 1 arg and get :" + datas.size()); throw std::runtime_error("not need 1 arg and get :" + mResolution.size());
} }
auto a = datas[0]; auto a = mResolution[0];
std::vector<ConditionalData*> dataVector;
if (a->getType() != typeid(bool).name()){ if (a->getType() != typeid(bool).name()){
throw std::runtime_error("NOT Unknown type encountered need bool get :" + a->getType() ); throw std::runtime_error("NOT Unknown type encountered need bool get :" + a->getType() );
...@@ -373,12 +338,7 @@ using namespace Aidge; ...@@ -373,12 +338,7 @@ using namespace Aidge;
ConditionalData* data = new ConditionalData; ConditionalData* data = new ConditionalData;
data->setValue<bool>( !a->getValue<bool>() ); data->setValue<bool>( !a->getValue<bool>() );
clearRes();
mResolution.push_back(data);
dataVector.push_back(data);
//clear
for (std::size_t i = 0; i < datas.size(); ++i) {
delete datas[i];
}
datas.clear();
return dataVector;
} }
...@@ -27,4 +27,40 @@ TEST_CASE("ConditionalInterpreter", "ConditionalInterpreter") { ...@@ -27,4 +27,40 @@ TEST_CASE("ConditionalInterpreter", "ConditionalInterpreter") {
REQUIRE_THROWS_AS( ConditionalInterpreter(test), std::runtime_error); REQUIRE_THROWS_AS( ConditionalInterpreter(test), std::runtime_error);
} }
SECTION("test false int ") {
const std::string test = " 10 == 11 " ;
ConditionalInterpreter conditionalParser = ConditionalInterpreter(test);
std::shared_ptr<Node> nodeOp = GenericOperator("conv", 0, 0, 0, "Gop1");
bool result = conditionalParser.test(nodeOp);
REQUIRE(result == false);
}
SECTION("test true int ") {
const std::string test = " 42 == 42 " ;
ConditionalInterpreter conditionalParser = ConditionalInterpreter(test);
std::shared_ptr<Node> nodeOp = GenericOperator("conv", 0, 0, 0, "Gop1");
bool result = conditionalParser.test(nodeOp);
REQUIRE(result == true);
}
SECTION("test false str ") {
const std::string test = " 'toto' == 'Corgi' " ;
ConditionalInterpreter conditionalParser = ConditionalInterpreter(test);
std::shared_ptr<Node> nodeOp = GenericOperator("conv", 0, 0, 0, "Gop1");
bool result = conditionalParser.test(nodeOp);
REQUIRE(result == false);
}
SECTION("test true str ") {
const std::string test = " 'Corgi' == 'Corgi' " ;
ConditionalInterpreter conditionalParser = ConditionalInterpreter(test);
std::shared_ptr<Node> nodeOp = GenericOperator("conv", 0, 0, 0, "Gop1");
bool result = conditionalParser.test(nodeOp);
REQUIRE(result == true);
}
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment