00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef INDRI_DAGCOPIER_HPP
00020 #define INDRI_DAGCOPIER_HPP
00021
00022 #include <vector>
00023 #include "indri/delete_range.hpp"
00024
00025 class DagCopier : public indri::lang::Copier {
00026 private:
00027 std::vector<indri::lang::IndexTerm*> _terms;
00028 std::vector<indri::lang::Field*> _fields;
00029 std::vector<indri::lang::ExtentOr*> _extentOrs;
00030 std::vector<indri::lang::ExtentAnd*> _extentAnds;
00031 std::vector<indri::lang::ExtentInside*> _extentInsides;
00032 std::vector<indri::lang::ODNode*> _odNodes;
00033 std::vector<indri::lang::UWNode*> _uwNodes;
00034
00035 std::vector<indri::lang::Node*> _newNodes;
00036
00037 template<class T>
00038 T* _findReplacement( std::vector<T*>& replacements, T* candidate ) {
00039 T* replacement = 0;
00040
00041 for( unsigned int i=0; i<replacements.size(); i++ ) {
00042 if( (*candidate) == (*replacements[i]) ) {
00043 replacement = replacements[i];
00044 break;
00045 }
00046 }
00047
00048 if( replacement ) {
00049 delete candidate;
00050 candidate = replacement;
00051 } else {
00052 _newNodes.push_back( candidate );
00053 replacements.push_back( candidate );
00054 }
00055
00056 return candidate;
00057 }
00058
00059 public:
00060 ~DagCopier() {
00061 delete_vector_contents( _newNodes );
00062 }
00063
00064 indri::lang::Node* defaultAfter( indri::lang::Node* oldNode, indri::lang::Node* newNode ) {
00065 _newNodes.push_back( newNode );
00066 return newNode;
00067 }
00068
00069 indri::lang::Node* after( indri::lang::IndexTerm* indexTerm, indri::lang::IndexTerm* newIndexTerm ) {
00070 return _findReplacement<indri::lang::IndexTerm>( _terms, newIndexTerm );
00071 }
00072
00073 indri::lang::Node* after( indri::lang::Field* field, indri::lang::Field* newField ) {
00074 return _findReplacement<indri::lang::Field>( _fields, newField );
00075 }
00076
00077 indri::lang::Node* after( indri::lang::ExtentOr* oldExtentOr, indri::lang::ExtentOr* newExtentOr ) {
00078 return _findReplacement<indri::lang::ExtentOr>( _extentOrs, newExtentOr );
00079 }
00080
00081 indri::lang::Node* after( indri::lang::ExtentAnd* oldExtentAnd, indri::lang::ExtentAnd* newExtentAnd ) {
00082 return _findReplacement<indri::lang::ExtentAnd>( _extentAnds, newExtentAnd );
00083 }
00084
00085 indri::lang::Node* after( indri::lang::ExtentInside* oldExtentInside, indri::lang::ExtentInside* newExtentInside ) {
00086 return _findReplacement<indri::lang::ExtentInside>( _extentInsides, newExtentInside );
00087 }
00088
00089 indri::lang::Node* after( indri::lang::ODNode* oldODNode, indri::lang::ODNode* newODNode ) {
00090 return _findReplacement<indri::lang::ODNode>( _odNodes, newODNode );
00091 }
00092
00093 indri::lang::Node* after( indri::lang::UWNode* oldUWNode, indri::lang::UWNode* newUWNode ) {
00094 return _findReplacement<indri::lang::UWNode>( _uwNodes, newUWNode );
00095 }
00096 };
00097
00098 #endif // INDRI_DAGCOPIER_HPP
00099