#include "zypp/base/NonCopyable.h"
#include "zypp/base/DefaultIntegral.h"
+#include "zypp/Pathname.h"
+
///////////////////////////////////////////////////////////////////
namespace zypp
{ /////////////////////////////////////////////////////////////////
//
/** Find pathnames matching a pattern.
* \code
- * Glob glob( Glob::_BRACE );
- * glob.add( "/somewherre/solverTestcase/ *{.xml,.xml.gz}" );
+ * Glob glob( Glob::kBrace );
+ * glob.add( "/somewhere/solverTestcase/ *{.xml,.xml.gz}" );
+ * glob.add( "/somewhere/else/a*" );
+ * for_( it, glob.begin(), glob.end() )
+ * ...
* \endcode
* \code
* std::list<Pathname> plist;
- * Glob::collect( "/somewherre/solverTestcase/ *{.xml,.xml.gz}", Glob::_BRACE,
+ * Glob::collect( "/somewherre/solverTestcase/ *{.xml,.xml.gz}", Glob::kBrace,
* std::back_inserter( plist ) );
* \endcode
* \see Manual page glob(3)
, char ** // Base
, value_type // Value
, boost::forward_traversal_tag // CategoryOrTraversal
- , const value_type & // Reference
+ , const value_type // Reference
>
{
public:
if ( base_reference() && !*(++base_reference()) )
base_reference() = 0;
}
+ reference dereference() const
+ { return( base() ? *base() : 0 ); }
};
///////////////////////////////////////////////////////////////////
public:
/** Individual bits to combine in \ref Flags. */
enum Bits {
- _ERR = GLOB_ERR, //!< Return on read errors.
- _MARK = GLOB_MARK, //!< Append a slash to each name.
- _NOSORT = GLOB_NOSORT, //!< Don't sort the names.
- // unsupported _DOOFFS = GLOB_DOOFFS, //!< Insert PGLOB->gl_offs NULLs.
- _NOCHECK = GLOB_NOCHECK, //!< If nothing matches, return the pattern.
- // autoapplied _APPEND = GLOB_APPEND, //!< Append to results of a previous call.
- _NOESCAPE = GLOB_NOESCAPE, //!< Backslashes don't quote metacharacters.
- _PERIOD = GLOB_PERIOD, //!< Leading `.' can be matched by metachars.
- // unsupported _MAGCHAR = GLOB_MAGCHAR,//!< Set in gl_flags if any metachars seen.
- _ALTDIRFUNC = GLOB_ALTDIRFUNC, //!< Use gl_opendir et al functions.
- _BRACE = GLOB_BRACE, //!< Expand "{a,b}" to "a" "b".
- _NOMAGIC = GLOB_NOMAGIC, //!< If no magic chars, return the pattern.
- _TILDE = GLOB_TILDE, //!< Expand ~user and ~ to home directories.
- _ONLYDIR = GLOB_ONLYDIR, //!< Match only directories.
- _TILDE_CHECK = GLOB_TILDE_CHECK, //!< Like GLOB_TILDE but return an error if the user name is not available.
+ kErr = GLOB_ERR, //!< Return on read errors.
+ kMark = GLOB_MARK, //!< Append a slash to each name.
+ kNoSort = GLOB_NOSORT, //!< Don't sort the names.
+ // unsupported kDoOffs = GLOB_DOOFFS, //!< Insert PGLOB->gl_offs NULLs.
+ kNoCheck = GLOB_NOCHECK, //!< If nothing matches, return the pattern.
+ // autoapplied kAppend = GLOB_APPEND, //!< Append to results of a previous call.
+ kNoEscape = GLOB_NOESCAPE, //!< Backslashes don't quote metacharacters.
+ kPeriod = GLOB_PERIOD, //!< Leading `.' can be matched by metachars.
+ // unsupported kMagChar = GLOB_MAGCHAR,//!< Set in gl_flags if any metachars seen.
+ kAltDirFunc = GLOB_ALTDIRFUNC, //!< Use gl_opendir et al functions.
+ kBrace = GLOB_BRACE, //!< Expand "{a,b}" to "a" "b".
+ kNoMagic = GLOB_NOMAGIC, //!< If no magic chars, return the pattern.
+ kTilde = GLOB_TILDE, //!< Expand ~user and ~ to home directories.
+ kOnlyDir = GLOB_ONLYDIR, //!< Match only directories.
+ kTildeCheck = GLOB_TILDE_CHECK, //!< Like GLOB_TILDE but return an error if the user name is not available.
};
/** type Flags: Type-safe OR-combination of \ref Bits. */
public:
/** Default ctor optionally taking the default flags.
* The flags passed here are the default for \ref add.
+ * \see \ref setDefaultFlags
*/
Glob( Flags flags_r = Flags() )
: _defaultFlags( flags_r )
/** Ctor adding pathnames matching \a pattern_r.
* The flags passed here are the default for \ref add.
+ * \see \ref setDefaultFlags
*/
+ explicit Glob( const Pathname & pattern_r, Flags flags_r = Flags() )
+ : _defaultFlags( flags_r )
+ { add( pattern_r, flags_r ); }
+ /** \overload */
explicit Glob( const std::string & pattern_r, Flags flags_r = Flags() )
: _defaultFlags( flags_r )
{ add( pattern_r, flags_r ); }
+ /** \overload */
+ explicit Glob( const char * pattern_r, Flags flags_r = Flags() )
+ : _defaultFlags( flags_r )
+ { add( pattern_r, flags_r ); }
/** Dtor */
~Glob()
/** Add pathnames matching \a pattern_r to the current result.
*
- * The flags passed here override the global default passed to
- * the ctor. GLOB_APPEND is atomatically added to the flags if needed.
+ * Any flags passed here override the global default passed to
+ * the ctor. GLOB_APPEND is atomatically added to the flags
+ * f needed.
*
* This invalidates all iterators.
* \see \ref setDefaultFlags
* \return the value returned by ::glob().
*/
- int add( const std::string & pattern_r, Flags flags_r = Flags() );
+ int add( const Pathname & pattern_r, Flags flags_r = Flags() )
+ { return add( pattern_r.c_str(), flags_r ); }
+ /** \overload */
+ int add( const std::string & pattern_r, Flags flags_r = Flags() )
+ { return add( pattern_r.c_str(), flags_r ); }
+ /** \overload */
+ int add( const char * pattern_r, Flags flags_r = Flags() );
+
+ /** Clear all results found so far. \ref defaultFlags remain active. */
+ void clear();
+
+ /** Clear all results and reset \ref defaultFlags. */
+ void reset( Flags flags_r = Flags() )
+ { clear(); setDefaultFlags( flags_r ); }
+
public:
/** The default flags passed to \c ::glob(). */
public:
- /** \name Collecting Glob results to some _OutputIterator
+ /** \name Collecting Glob results to some TOutputIterator
* \code
* std::list<Pathname> p;
- * Glob::collect( "/bin/m*", std::back_inserter(p) );
+ * Glob::collect( "/bin/a*.dat}", std::back_inserter(p) );
+ * Glob::collect( "/bin/a*{.xml,.xml.gz}", Glob::kBrace, std::back_inserter(p) );
* \endcode
*/
//@{
/** Write glob result to some \c OutputIterator. */
- template<class _OutputIterator>
- static int collect( const std::string & pattern_r, Flags flags_r, _OutputIterator result_r )
+ template<class TOutputIterator>
+ static int collect( const Pathname & pattern_r, TOutputIterator result_r )
+ { return collect( pattern_r.c_str(), Flags(), result_r ); }
+ /** \overload */
+ template<class TOutputIterator>
+ static int collect( const std::string & pattern_r, TOutputIterator result_r )
+ { return collect( pattern_r.c_str(), Flags(), result_r ); }
+ /** \overload */
+ template<class TOutputIterator>
+ static int collect( const char * pattern_r, TOutputIterator result_r )
+ { return collect( pattern_r, Flags(), result_r ); }
+
+ /** \overload With \ref Flags */
+ template<class TOutputIterator>
+ static int collect( const Pathname & pattern_r, Flags flags_r, TOutputIterator result_r )
+ { return collect( pattern_r.c_str(), flags_r, result_r ); }
+ /** \overload */
+ template<class TOutputIterator>
+ static int collect( const std::string & pattern_r, Flags flags_r, TOutputIterator result_r )
+ { return collect( pattern_r.c_str(), flags_r, result_r ); }
+ /** \overload */
+ template<class TOutputIterator>
+ static int collect( const char * pattern_r, Flags flags_r, TOutputIterator result_r )
{
Glob glob( pattern_r, flags_r );
if ( glob.lastGlobReturn() == 0 )
for_( it, glob.begin(), glob.end() )
- (*result_r)++ = *it;
+ (*result_r)++ = typename TOutputIterator::container_type::value_type(*it);
return glob.lastGlobReturn();
}
- /** \overload */
- template<class _OutputIterator>
- static int collect( const std::string & pattern_r, _OutputIterator result_r )
- { return collect( pattern_r, Flags(), result_r ); }
//@}
private:
/** \relates Glob Stream output */
std::ostream & operator<<( std::ostream & str, const Glob & obj );
+ /** \relates Glob::const_iterator Stream output */
+ inline std::ostream & operator<<( std::ostream & str, const Glob::const_iterator & obj )
+ { return str << *obj; }
+
ZYPP_DECLARE_OPERATORS_FOR_FLAGS( Glob::Flags );
///////////////////////////////////////////////////////////////////