Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

FileList.h

00001 #ifndef EDG_WORKLOAD_COMMON_UTILITIES_FILELIST_H
00002 #define EDG_WORKLOAD_COMMON_UTILITIES_FILELIST_H
00003 
00004 #include <boost/lexical_cast.hpp>
00005 
00006 #include "filecontainer.h"
00007 #include "FileListIterator.h"
00008 
00009 COMMON_NAMESPACE_BEGIN {
00010 
00011 namespace utilities {
00012 
00013 class FileListDescriptorMutex;
00014 
00015 class _file_sequence_t {
00016   friend class FileListDescriptorMutex;
00017   friend class _base_iterator_t;
00018 
00019 public:
00020   void clear( void );
00021   void compact( void );
00022   void sync( void );
00023   void open( const char *filename );
00024   bool modified( void );
00025   bool empty( void );
00026   size_t size( void );
00027 
00028   inline void close( void ) { this->fs_container.close(); }
00029   inline const std::string &filename( void ) const { return this->fs_container.filename(); }
00030 
00031 private:
00032   typedef FileContainerError::iostatus_t   iostatus_t;
00033 
00034 protected:
00035   _file_sequence_t( void );
00036   _file_sequence_t( const char *filename );
00037 
00038   ~_file_sequence_t( void );
00039 
00040   _base_iterator_t &insertData( const _base_iterator_t &position, const std::string &val );
00041   _base_iterator_t &erasePointer( const _base_iterator_t &position );
00042   _base_iterator_t &eraseInterval( const _base_iterator_t &first, const _base_iterator_t &last );
00043   _base_iterator_t &getBegin( void );
00044   _base_iterator_t &getEnd( void );
00045   _base_iterator_t &getStart( void );
00046   _base_iterator_t &getLast( void );
00047 
00048   void removeData( const std::string &value );
00049   void swapContainer( _file_sequence_t &other );
00050 
00051 protected:
00052   FileContainer           fs_container;
00053   _base_iterator_t        fs_last;
00054 };
00055 
00056 template <class Type, class Converter = StdConverter<Type> >
00057 class FileList : public _file_sequence_t {
00058 public:
00059   typedef Type                               value_type;
00060   typedef Type *                             pointer;
00061   typedef const Type *                       const_pointer;
00062   typedef Type &                             reference;
00063   typedef const Type &                       const_reference;
00064   typedef FLIterator<Type, Converter>        iterator;
00065 
00066   FileList( void );
00067   FileList( const std::string &filename );
00068   FileList( const char *filename );
00069 
00070   ~FileList( void );
00071 
00072   inline void open( const std::string &filename )
00073   { this->_file_sequence_t::open( filename.c_str() ); }
00074 
00075   inline iterator begin( void ) { return iterator( this->getBegin() ); }
00076   inline iterator end( void ) { return iterator( this->getEnd() ); }
00077 
00078   inline Type front( void ) { return *(this->begin()); }
00079   inline Type back( void ) { return *(--this->end()); }
00080 
00081   inline void push_front( const Type &data ) { this->insertData( this->getBegin(), iterator::fli_s_converter(data) ); }
00082   inline void push_back( const Type &data ) { this->insertData( this->getEnd(), iterator::fli_s_converter(data) ); }
00083 
00084   inline void pop_front( void ) { this->erasePointer( this->getBegin() ); }
00085   inline void pop_back( void ) { this->erasePointer( this->getEnd().decrement() ); }
00086 
00087   template <class InIt>
00088   inline void insert( const iterator &position, InIt first, InIt last )
00089   {
00090     InIt                    it;
00091     _base_iterator_t        mylast, begin = this->getBegin(), end = this->getEnd();
00092 
00093     if( position.getBase().is_equal(end) ) {
00094       for( it = first; it != last; ++it )
00095         this->insertData( this->getEnd(), iterator::fli_s_converter(*it) );
00096     }
00097     else {
00098       for( it = first; it != last; ++it )
00099         this->insertData( position.getBase(), iterator::fli_s_converter(*it) );
00100     }
00101 
00102     return;
00103   }
00104 
00105   inline iterator insert( const iterator &position, const Type &val )
00106   { return iterator( this->insertData(position.getBase(), iterator::fli_s_converter(val)) ); }
00107   inline iterator erase( const iterator &position )
00108   { return iterator( this->erasePointer(position.getBase()) ); }
00109   inline iterator erase( const iterator &first, const iterator &last )
00110   { return iterator( this->eraseInterval(first.getBase(), last.getBase()) ); }
00111 
00112   inline void swap( FileList<Type, Converter> &other ) { this->swapContainer(other); }
00113 
00114   void remove( const Type &val ) { this->removeData( iterator::fli_s_converter(data) ); }
00115 };
00116 
00117 template<class Type, class Converter>
00118 FileList<Type, Converter>::FileList<Type, Converter>( void ) : _file_sequence_t() {}
00119 
00120 template<class Type, class Converter>
00121 FileList<Type, Converter>::FileList<Type, Converter>( const std::string &filename ) :
00122   _file_sequence_t( filename.c_str() )
00123 {}
00124 
00125 template<class Type, class Converter>
00126 FileList<Type, Converter>::FileList<Type, Converter>( const char *filename ) :
00127   _file_sequence_t( filename )
00128 {}
00129 
00130 template<class Type, class Converter>
00131 FileList<Type, Converter>::~FileList<Type, Converter>( void ) {}
00132 
00133 template<> 
00134 inline void FileList<std::string>::push_front( const std::string &data ) { this->insertData( this->getBegin(), data ); }
00135 
00136 template<>
00137 inline void FileList<std::string>::push_back( const std::string &data ) { this->insertData( this->getEnd(), data ); }
00138 
00139 template<>
00140 inline FileList<std::string>::iterator FileList<std::string>::insert( const FileList<std::string>::iterator &position,
00141                                                                       const std::string &val )
00142 { return iterator( this->insertData(position.getBase(), val) ); }
00143 
00144 template<>
00145 inline void FileList<std::string>::remove( const std::string &val ) { this->removeData( val ); }
00146 
00147 }; // Namespace utilities
00148 
00149 } COMMON_NAMESPACE_END;
00150 
00151 #endif /* EDG_WORKLOAD_COMMON_UTILITIES_FILELIST_H */
00152 
00153 // Local Variables:
00154 // mode: c++
00155 // End:

Generated on Fri May 14 14:18:25 2004 for COMMON API - configuration, jobid, ldif2classadi, logger, process, requestad, socket++i, task, utilities by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002