00001 #pragma once 00002 00003 #include <vector> 00004 00005 namespace MosesTraining 00006 { 00007 namespace Syntax 00008 { 00009 namespace FilterRuleTable 00010 { 00011 00012 template<typename T> 00013 struct Forest { 00014 struct Vertex; 00015 00016 struct Hyperedge { 00017 Vertex *head; 00018 std::vector<Vertex *> tail; 00019 }; 00020 00021 struct Vertex { 00022 ~Vertex(); 00023 T value; 00024 std::vector<Hyperedge *> incoming; 00025 }; 00026 00027 Forest() {} 00028 00029 ~Forest(); 00030 00031 std::vector<Vertex *> vertices; 00032 00033 private: 00034 // Copying is not allowed. 00035 Forest(const Forest &); 00036 Forest &operator=(const Forest &); 00037 }; 00038 00039 template<typename T> 00040 Forest<T>::~Forest() 00041 { 00042 for (typename std::vector<Vertex *>::iterator p = vertices.begin(); 00043 p != vertices.end(); ++p) { 00044 delete *p; 00045 } 00046 } 00047 00048 template<typename T> 00049 Forest<T>::Vertex::~Vertex() 00050 { 00051 for (typename std::vector<Hyperedge *>::iterator p = incoming.begin(); 00052 p != incoming.end(); ++p) { 00053 delete *p; 00054 } 00055 } 00056 00057 } // namespace FilterRuleTable 00058 } // namespace Syntax 00059 } // namespace Moses