00001 #ifndef CLASSLIB_SEARCH_PATH_H
00002 # define CLASSLIB_SEARCH_PATH_H
00003
00004
00005
00006 # include "classlib/iobase/Filename.h"
00007 # include <string>
00008 # include <list>
00009 # undef SearchPath // Ugh, defined by windows to SearchPath[UA]
00010
00011 namespace lat {
00012
00013
00014
00015
00016 class SearchPath;
00017 class logstream;
00018
00019
00020
00021
00022 logstream &operator<< (logstream &out, const SearchPath &path);
00023
00024
00025
00027 class SearchPath
00028 {
00029 typedef std::list<Filename> DirList;
00030 public:
00031 typedef DirList::iterator iterator;
00032 typedef DirList::const_iterator const_iterator;
00033 typedef DirList::reverse_iterator reverse_iterator;
00034 typedef DirList::const_reverse_iterator const_reverse_iterator;
00035
00036 typedef DirList::size_type size_type;
00037 typedef DirList::reference reference;
00038 typedef DirList::const_reference const_reference;
00039
00040 SearchPath (void);
00041 explicit SearchPath (const std::string &path);
00042 # if HAVE_MEMBER_TEMPLATES
00043 template <class I> SearchPath (I first, I last);
00044 # else
00045 SearchPath (const_iterator first, const_iterator last);
00046 # endif
00047
00048
00049
00050
00051
00052 bool operator== (const SearchPath &x);
00053 bool empty (void) const;
00054 size_type size (void) const;
00055
00056
00057 iterator begin (void);
00058 const_iterator begin (void) const;
00059 iterator end (void);
00060 const_iterator end (void) const;
00061
00062 reverse_iterator rbegin (void);
00063 const_reverse_iterator rbegin (void) const;
00064 reverse_iterator rend (void);
00065 const_reverse_iterator rend (void) const;
00066
00067 reference front (void);
00068 const_reference front (void) const;
00069 reference back (void);
00070 const_reference back (void) const;
00071
00072
00073 void swap (SearchPath &x);
00074
00075 void push_front (const Filename &dir);
00076 void push_back (const Filename &dir);
00077 iterator insert (iterator pos, const Filename &dir);
00078 void insert (iterator pos, const_iterator first,
00079 const_iterator last);
00080
00081 void pop_front (void);
00082 void pop_back (void);
00083 iterator erase (iterator pos);
00084 iterator erase (iterator first, iterator last);
00085 void clear (void);
00086
00087 void splice (iterator pos, SearchPath &x);
00088 void splice (iterator pos, SearchPath &x,
00089 iterator i);
00090 void splice (iterator pos, SearchPath &x,
00091 iterator first, iterator last);
00092
00093 void remove (const Filename &dir);
00094 void reverse (void);
00095
00096
00097
00098
00099 Filename expand (const Filename &name) const;
00100 const_iterator search (const Filename &name) const;
00101 const_iterator search (const_iterator from,
00102 const Filename &name) const;
00103
00104
00105 static const char * separator (void);
00106
00107 private:
00108 DirList m_list;
00109 };
00110
00111
00112
00113
00115 inline
00116 SearchPath::SearchPath (void)
00117 {}
00118
00119 # if HAVE_MEMBER_TEMPLATES
00120
00121 template <class I> inline
00122 SearchPath::SearchPath (I first, I last)
00123 : m_list (first, last)
00124 {}
00125 # else // ! HAVE_MEMBER_TEMPLATES
00126
00127 inline
00128 SearchPath::SearchPath (const_iterator first, const_iterator last)
00129 : m_list (first, last)
00130 {}
00131 # endif // HAVE_MEMBER_TEMPLATES
00132
00136 inline bool
00137 SearchPath::operator== (const SearchPath &x)
00138 { return m_list == x.m_list; }
00139
00141 inline bool
00142 SearchPath::empty (void) const
00143 { return m_list.empty (); }
00144
00146 inline SearchPath::size_type
00147 SearchPath::size (void) const
00148 { return m_list.size (); }
00149
00151 inline SearchPath::iterator
00152 SearchPath::begin (void)
00153 { return m_list.begin (); }
00154
00156 inline SearchPath::const_iterator
00157 SearchPath::begin (void) const
00158 { return m_list.begin (); }
00159
00161 inline SearchPath::iterator
00162 SearchPath::end (void)
00163 { return m_list.end (); }
00164
00166 inline SearchPath::const_iterator
00167 SearchPath::end (void) const
00168 { return m_list.end (); }
00169
00171 inline SearchPath::reverse_iterator
00172 SearchPath::rbegin (void)
00173 { return m_list.rbegin (); }
00174
00176 inline SearchPath::const_reverse_iterator
00177 SearchPath::rbegin (void) const
00178 { return m_list.rbegin (); }
00179
00181 inline SearchPath::reverse_iterator
00182 SearchPath::rend (void)
00183 { return m_list.rend (); }
00184
00186 inline SearchPath::const_reverse_iterator
00187 SearchPath::rend (void) const
00188 { return m_list.rend (); }
00189
00192 inline SearchPath::reference
00193 SearchPath::front (void)
00194 { return m_list.front (); }
00195
00198 inline SearchPath::const_reference
00199 SearchPath::front (void) const
00200 { return m_list.front (); }
00201
00204 inline SearchPath::reference
00205 SearchPath::back (void)
00206 { return m_list.back (); }
00207
00210 inline SearchPath::const_reference
00211 SearchPath::back (void) const
00212 { return m_list.back (); }
00213
00215 inline void
00216 SearchPath::swap (SearchPath &x)
00217 { m_list.swap (x.m_list); }
00218
00220 inline void
00221 SearchPath::push_front (const Filename &dir)
00222 { m_list.push_front (dir); }
00223
00225 inline void
00226 SearchPath::push_back (const Filename &dir)
00227 { m_list.push_back (dir); }
00228
00231 inline SearchPath::iterator
00232 SearchPath::insert (iterator pos, const Filename &dir)
00233 { return m_list.insert (pos, dir); }
00234
00238 inline void
00239 SearchPath::insert (iterator pos, const_iterator first, const_iterator last)
00240 { m_list.insert (pos, first, last); }
00241
00244 inline void
00245 SearchPath::pop_front (void)
00246 { m_list.pop_front (); }
00247
00250 inline void
00251 SearchPath::pop_back (void)
00252 { m_list.pop_back (); }
00253
00256 inline SearchPath::iterator
00257 SearchPath::erase (iterator pos)
00258 { return m_list.erase (pos); }
00259
00262 inline SearchPath::iterator
00263 SearchPath::erase (iterator first, iterator last)
00264 { return m_list.erase (first, last); }
00265
00267 inline void
00268 SearchPath::clear (void)
00269 { m_list.clear (); }
00270
00273 inline void
00274 SearchPath::splice (iterator pos, SearchPath &x)
00275 { m_list.splice (pos, x.m_list); }
00276
00281 inline void
00282 SearchPath::splice (iterator pos, SearchPath &x, iterator i)
00283 { m_list.splice (pos, x.m_list, i); }
00284
00290 inline void
00291 SearchPath::splice (iterator pos, SearchPath &x, iterator first, iterator last)
00292 { m_list.splice (pos, x.m_list, first, last); }
00293
00295 inline void
00296 SearchPath::remove (const Filename &dir)
00297 { m_list.remove (dir); }
00298
00300 inline void
00301 SearchPath::reverse (void)
00302 { m_list.reverse (); }
00303
00311 inline SearchPath::const_iterator
00312 SearchPath::search (const Filename &name) const
00313 { return search (begin (), name); }
00314
00315 }
00316 #endif // CLASSLIB_SEARCH_PATH_H