#ifndef _LOGIC_H
#define _LOGIC_H

#include <memory>
#include <vector>

namespace smo {
namespace logic {

class ExpressionPart
{
};

class Operator
:	public ExpressionPart
{
};

class OperatorAnd
: public Operator
{
};

class OperatorOr
: public Operator
{
};

class OperatorNot
: public Operator
{
};

class Operand
:	public ExpressionPart
{
};

class UnaryExpression
:	public ExpressionPart
{
public:
	UnaryExpression(Operator &op, const std::shared_ptr<Operand> &operand)
	:	parts(std::make_pair(op, operand))
	{}
public:
	std::pair<Operator, std::shared_ptr<Operand>> parts;
};

// Expressions can be chained as parts of a larger expression
class Expression
:	public ExpressionPart
{
public:
	// This will eventually take in some data to be evaluated for a match.
	virtual bool evaluate(void) = 0;

public:
	std::vector<std::shared_ptr<ExpressionPart>> parts;
};

} // namespace logic
} // namespace smo

#endif
