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 };
00148
00149 } COMMON_NAMESPACE_END;
00150
00151 #endif
00152
00153
00154
00155