Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

DagCopier.hpp

Go to the documentation of this file.
00001 /*==========================================================================
00002  * Copyright (c) 2004 University of Massachusetts.  All Rights Reserved.
00003  *
00004  * Use of the Lemur Toolkit for Language Modeling and Information Retrieval
00005  * is subject to the terms of the software license set forth in the LICENSE
00006  * file included with this software, and also available at
00007  * http://www.lemurproject.org/license.html
00008  *
00009  *==========================================================================
00010 */
00011 
00012 
00013 //
00014 // DagCopier
00015 //
00016 // 5 March 2004 -- tds
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 

Generated on Wed Nov 3 12:58:53 2004 for Lemur Toolkit by doxygen1.2.18