#ifndef __PDDL_PARSE__DETAIL__AST_COPY_H #define __PDDL_PARSE__DETAIL__AST_COPY_H #include namespace pddl { namespace ast { //////////////////////////////////////////////////////////////////////////////////////////////////// // // ASTCopy // //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // Primitives //////////////////////////////////////////////////////////////////////////////////////////////////// inline Constant deepCopy(Constant &other); inline PrimitiveType deepCopy(PrimitiveType &other); inline Variable deepCopy(Variable &other); //////////////////////////////////////////////////////////////////////////////////////////////////// // Expressions: Base Classes //////////////////////////////////////////////////////////////////////////////////////////////////// template inline Binary deepCopy(Binary &other); template inline NAry deepCopy(NAry &other); template inline Quantified deepCopy(Quantified &other); //////////////////////////////////////////////////////////////////////////////////////////////////// // Expressions //////////////////////////////////////////////////////////////////////////////////////////////////// template inline At deepCopy(At &other); template inline Not deepCopy(Not &other); //////////////////////////////////////////////////////////////////////////////////////////////////// // Variants //////////////////////////////////////////////////////////////////////////////////////////////////// inline ast::Term deepCopy(ast::Term &other); //////////////////////////////////////////////////////////////////////////////////////////////////// // Primitives //////////////////////////////////////////////////////////////////////////////////////////////////// Constant deepCopy(Constant &other) { return Constant(other.declaration); } //////////////////////////////////////////////////////////////////////////////////////////////////// PrimitiveType deepCopy(PrimitiveType &other) { return PrimitiveType(other.declaration); } //////////////////////////////////////////////////////////////////////////////////////////////////// Variable deepCopy(Variable &other) { return Variable(other.declaration); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Expressions: Base Classes //////////////////////////////////////////////////////////////////////////////////////////////////// template Binary deepCopy(Binary &other) { auto argumentLeft = deepCopy(other.argumentLeft); auto argumentRight = deepCopy(other.argumentRight); return Binary(std::move(argumentLeft), std::move(argumentRight)); } //////////////////////////////////////////////////////////////////////////////////////////////////// template NAry deepCopy(NAry &other) { typename NAry::Arguments arguments; arguments.reserve(other.arguments.size()); for (auto &argument : other.arguments) arguments.emplace_back(deepCopy(argument)); return NAry(std::move(arguments)); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Quantified deepCopy(Quantified &other) { auto argument = deepCopy(other.argument); return Quantified(std::move(argument)); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Expressions //////////////////////////////////////////////////////////////////////////////////////////////////// template At deepCopy(At &other) { auto argument = deepCopy(other.argument); return At(other.timePoint, std::move(argument)); } //////////////////////////////////////////////////////////////////////////////////////////////////// template Not deepCopy(Not &other) { auto argument = deepCopy(other.argument); return Not(std::move(argument)); } //////////////////////////////////////////////////////////////////////////////////////////////////// // Variants //////////////////////////////////////////////////////////////////////////////////////////////////// struct DeepCopyVisitor { template Argument visit(Argument &other) { return deepCopy(other); } }; //////////////////////////////////////////////////////////////////////////////////////////////////// // Unique Pointers //////////////////////////////////////////////////////////////////////////////////////////////////// template std::unique_ptr deepCopy(std::unique_ptr &other) { return std::make_unique(deepCopy(*other)); } //////////////////////////////////////////////////////////////////////////////////////////////////// } } #endif