Program Listing for File FunctionModifier.h

Return to documentation for file (/tmp/ws/src/ros2_planning_system/plansys2_pddl_parser/include/plansys2_pddl_parser/FunctionModifier.h)

#pragma once

#include "plansys2_msgs/msg/node.hpp"
#include "plansys2_msgs/msg/tree.hpp"

#include "plansys2_pddl_parser/Ground.h"
#include "plansys2_pddl_parser/Condition.h"
#include "plansys2_pddl_parser/Function.h"
#include "plansys2_pddl_parser/Expression.h"


namespace parser { namespace pddl {

class FunctionModifier : public Condition {

public:

    std::string name;

    Ground * modifiedGround;  // if null -> total-cost
    Expression * modifierExpr;  // the expression by which we increment/decrement

    FunctionModifier( const std::string& name, int val = 1 );

    FunctionModifier( const std::string& name, Function * f, const IntVec & p = IntVec() );

    FunctionModifier( const std::string& name, const FunctionModifier * i, Domain & d );

    ~FunctionModifier() {
        if ( modifiedGround ) delete modifiedGround;
        if ( modifierExpr ) delete modifierExpr;
    }

    void print( std::ostream & s ) const {
        s << name << " ";
        if ( modifiedGround ) modifiedGround->print( s );
        if ( modifierExpr ) modifierExpr->print( s );
        s << "\n";
    }

    void PDDLPrint( std::ostream & s, unsigned indent, const TokenStruct< std::string > & ts, const Domain & d ) const override;

    plansys2_msgs::msg::Node::SharedPtr getTree( plansys2_msgs::msg::Tree & tree, const Domain & d, const std::vector<std::string> & replace = {} ) const override;

    void parse( Stringreader & f, TokenStruct< std::string > & ts, Domain & d );

    void addParams( int m, unsigned n ) {}
};

class Assign : public FunctionModifier {

public:

    Assign( int val = 1 ) : FunctionModifier( "assign", val ) { }

    Assign( Function * f, const IntVec & p = IntVec() ) : FunctionModifier( "assign", f, p ) { }

    Assign( const FunctionModifier * i, Domain & d ) : FunctionModifier( "assign", i, d ) { }

    Condition * copy( Domain & d ) {
        return new Assign( this, d );
    }
};

class Decrease : public FunctionModifier {

public:

    Decrease( int val = 1 ) : FunctionModifier( "decrease", val ) { }

    Decrease( Function * f, const IntVec & p = IntVec() ) : FunctionModifier( "decrease", f, p ) { }

    Decrease( const FunctionModifier * i, Domain & d ) : FunctionModifier( "decrease", i, d ) { }

    Condition * copy( Domain & d ) {
        return new Decrease( this, d );
    }
};

class Increase : public FunctionModifier {

public:

    Increase( int val = 1 ) : FunctionModifier( "increase", val ) { }

    Increase( Function * f, const IntVec & p = IntVec() ) : FunctionModifier( "increase", f, p ) { }

    Increase( const FunctionModifier * i, Domain & d ) : FunctionModifier( "increase", i, d ) { }

    Condition * copy( Domain & d ) {
        return new Increase( this, d );
    }
};

} } // namespaces