The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include <string>
#include <vector>
#include <sys/types.h>
#include <dirent.h>

class DirectoryIterator
{
private:
  std::vector<std::string> dirs_;
  bool show_dotfiles_;
  bool show_directories_;
  bool do_recurse_;
    
  DIR * dh_;
  std::string file_;
  std::string dir_;
  static const std::string separator_;
  
  bool is_dir_;
    
  bool scan();
  
public:
  DirectoryIterator( std::string const & dir ) 
  {
    dh_ = 0;
    do_recurse_ = true;
    show_dotfiles_ = false;
    
    dirs_.push_back(dir);
  }
  ~DirectoryIterator() 
  {
    if (dh_) closedir(dh_);
  }

  bool next();
 
  void show_dotfiles(bool arg) 
  {
      show_dotfiles_ = arg? true : false;
  }

  void show_directories(bool arg) 
  {
    show_directories_ = arg? true : false;
  }
  
    void recursive(bool arg) 
    {
	do_recurse_ = arg? true : false;
    }
    
    bool is_directory() const
    {
	return is_dir_;
    }
    
  std::string get() const
  {
    return dir_ + separator_ + file_;
  }

  void prune();
  std::string prune_directory();
    
};