/*
 * TreeFeatures.h
 *
 *  Created on: Nov 16, 2014
 *      Author: Stepan Plachy
 */

#ifndef TREE_FEATURES_H_
#define TREE_FEATURES_H_

#include <alphabet/Symbol.h>
#include <primitive/Unsigned.h>

namespace tree {

enum class FEATURES {
	RANKED_TREE,
	RANKED_PATTERN,
	RANKED_NONLINEAR_PATTERN,
	PREFIX_RANKED_TREE,
	PREFIX_RANKED_BAR_TREE,
	PREFIX_RANKED_PATTERN,
	PREFIX_RANKED_BAR_PATTERN,
	PREFIX_RANKED_NONLINEAR_PATTERN,
	PREFIX_RANKED_BAR_NONLINEAR_PATTERN,
	UNRANKED_TREE,
	UNRANKED_PATTERN,
	UNRANKED_NONLINEAR_PATTERN
};

class Tree;
class TreeBase;

template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned  >
class RankedTree;
class RankedPattern;
class RankedNonlinearPattern;
class PrefixRankedTree;
class PrefixRankedBarTree;
class PrefixRankedPattern;
class PrefixRankedNonlinearPattern;
class PrefixRankedBarPattern;
class PrefixRankedBarNonlinearPattern;
template < class SymbolType = alphabet::Symbol >
class UnrankedTree;
class UnrankedPattern;
class UnrankedNonlinearPattern;
template < class SymbolType = alphabet::Symbol >
class PrefixBarTree;

} /* namespace tree */

#endif /* TREE_FEATURES_H_ */