FREE Subscription to Dr. Dobb’s Digest: Same Great Content, New Digital Edition
Site Archive (Complete)
Dobbs M-Dev
Email
Print
Reprint

add to:
Del.icio.us
Digg
Google
Furl
Slashdot
Y! MyWeb
Blink
March 01, 2003

Adapting Win32 Enumeration APIs to STL Iterator Concepts

(Page 10 of 13)
Adapting Win32 Enumeration APIs to STL Iterator Concepts

Listing 7 findfile_sequence_const_iterator

// Extract from winstl_findfile_sequence.h


template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
class basic_findfile_sequence_const_iterator
  : public stlsoft::iterator_base<winstl::input_iterator_tag,
                                  V, ws_ptrdiff_t, void, V>
{
public:
  typedef C                                               char_type;
  typedef T                                               traits_type;
  typedef V                                               value_type;
  typedef basic_findfile_sequence_const_iterator<C, T, V> class_type;
  typedef ws_typename_type_k traits_type::find_data_type  find_data_type;
  typedef basic_findfile_sequence<C, T>                   sequence_type;

protected:
  basic_findfile_sequence_const_iterator( sequence_type const &l
                                        , HANDLE hSrch
                                        , find_data_type const &data);
  basic_findfile_sequence_const_iterator(sequence_type const &l);
public:
  basic_findfile_sequence_const_iterator();
  basic_findfile_sequence_const_iterator(class_type &rhs);
  ~basic_findfile_sequence_const_iterator() winstl_throw_0();

public:
  class_type &operator ++();
  const class_type operator ++(int);
  const value_type operator *() const;
  ws_bool_t operator ==(class_type const &rhs) const;
  ws_bool_t operator !=(class_type const &rhs) const;

// Members
protected:
  friend class basic_findfile_sequence;

  sequence_type const * const                     m_list;
  HANDLE                                          m_hSrch;
  ws_typename_type_k traits_type::find_data_type  m_data;

// Not to be implemented
private:
  basic_findfile_sequence_const_iterator &operator =(class_type const &rhs);
};


template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline basic_findfile_sequence_const_iterator<C, T, V>::
    basic_findfile_sequence_const_iterator()
  : m_list(NULL)
  , m_hSrch(INVALID_HANDLE_VALUE)
{
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline basic_findfile_sequence_const_iterator<C, T, V>::
    basic_findfile_sequence_const_iterator(sequence_type const &l)
  : m_list(&l)
  , m_hSrch(INVALID_HANDLE_VALUE)
{
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline basic_findfile_sequence_const_iterator<C, T, V>::
    basic_findfile_sequence_const_iterator(class_type &rhs)
  : m_list(rhs.m_list)
  , m_hSrch(rhs.m_hSrch)
  , m_data(rhs.m_data)
{
  rhs.m_hSrch = INVALID_HANDLE_VALUE;
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline ws_typename_type_k class_type
  &basic_findfile_sequence_const_iterator<C, T, V>::
    operator =(class_type const &rhs)
{
  // Should only be comparing iterators from same container
  winstl_message_assert("Assigning iterators from separate sequences", m_list == rhs.m_list);

  m_hSrch = rhs.m_hSrch;
  m_data  = rhs.m_data;

  return *this;
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline basic_findfile_sequence_const_iterator<C, T, V>::
    ~basic_findfile_sequence_const_iterator() winstl_throw_0()
{
  if(m_hSrch != INVALID_HANDLE_VALUE)
  {
    ::FindClose(m_hSrch);
  }
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline ws_typename_type_k class_type
    &basic_findfile_sequence_const_iterator<C, T, V>::operator ++()
{
  ws_int_t  flags = m_list->m_flags;

  for(; m_hSrch != INVALID_HANDLE_VALUE; )
  {
    if(!traits_type::find_next_file(m_hSrch, &m_data))
    {
      ::FindClose(m_hSrch);

      m_hSrch = INVALID_HANDLE_VALUE;

      break;
    }
    else
    {
      if((m_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
      {
        // A file, and files requested, so break
        if(flags & sequence_type::files)
        {
          break;
        }
      }
      else
      {
        if(traits_type::is_dots(m_data.cFileName))
        {
          if(flags & sequence_type::includeDots)
          {
            // A dots file, and dots are requested
            break;
          }
        }
        else if(flags & sequence_type::directories)
        {
          // A directory, and directories requested
          break;
        }
      }
    }
  }

  return *this;
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline const ws_typename_type_k class_type 
    basic_findfile_sequence_const_iterator<C, T, V>::operator ++(int)
{
  // 
  class_type  ret(*this);

  operator ++();

  return ret;
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline const ws_typename_type_k value_type 
    basic_findfile_sequence_const_iterator<C, T, V>::operator *() const
{
  if(m_hSrch != INVALID_HANDLE_VALUE)
  {
    return value_type(m_data, m_list->m_subpath);
  }
  else
  {
    winstl_message_assert("Dereferencing end()-valued iterator", 0);

    return value_type();
  }
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline ws_bool_t basic_findfile_sequence_const_iterator::
    operator ==(class_type const &rhs) const
{
  ws_bool_t  eq;

  // Should only be comparing iterators from same container
  winstl_message_assert("Comparing iterators from separate sequences", m_list == rhs.m_list);

  // Not equal if one but not both handles is the INVALID_HANDLE_VALUE
  // or if the data is not equal.
  if( (m_hSrch == INVALID_HANDLE_VALUE) != 
      (rhs.m_hSrch == INVALID_HANDLE_VALUE) ||
    ( m_hSrch != INVALID_HANDLE_VALUE &&
      traits_type::str_compare(m_data.cFileName, rhs.m_data.cFileName)))
  {
    eq = ws_false_v;
  }
  else
  {
    eq = ws_true_v;
  }

  return eq;
}

template< ws_typename_param_k C
        , ws_typename_param_k T
        , ws_typename_param_k V
        >
inline ws_bool_t basic_findfile_sequence_const_iterator::
    operator !=(class_type const &rhs) const
{
  return ! operator ==(rhs);
}

Previous Page | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 Next Page
TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK