Boost logo

Boost :

Subject: Re: [boost] [filesystem] C++11 range-based for statement and BOOST_FOREACH support
From: Beman Dawes (bdawes_at_[hidden])
Date: 2012-07-13 07:38:26


On Fri, Jul 13, 2012 at 4:45 AM, Thorsten Ottosen
<thorsten.ottosen_at_[hidden]> wrote:
> On 12-07-2012 16:10, Beman Dawes wrote:
>>
>> Support for the C++11 range-based for statement and BOOST_FOREACH for
>> directory_iterator and recursive_directory_iterator has been added to
>> trunk. This clears feature requests 5896 and 6521.
>>
>> The range-based for has been tested against gcc 4.6, which works, and
>> against VC++2012 RC, which ICEs the compiler. The ICE has been
>> reported to Microsoft.
>>
>> If anyone gives either C++11 range-based for or BOOST_FOREACH a try,
>> I'd appreciate hearing about any problems. Both of these are new to
>> me, and I'm nervous about getting the enabler free functions right.
>
>
> Well, if you post the code, I'll take a look.

See below for my implementation.

> I'd expect boost::filesystem::begin( ... ) and end() to be implemented in
> terms of the std:: mechanism.
>
> We ought to add a macro in Boost.Range to do just that.

If a macro will cut the boilerplate required to support both C++11
range-based for and C++03 BOOST_FOREACH, I'm all for it.

Thanks,

--Beman

  // enable C++11 range-base for statement use
---------------------------------------//

  // begin() and end() are only used by a range-based for statement
in the context of
  // auto - thus the top-level const is stripped - so returning const
is harmless and
  // emphasizes begin() is just a pass through.
  inline
  const directory_iterator& begin(const directory_iterator& iter)
{return iter;}
  inline
  directory_iterator end(const directory_iterator&) {return
directory_iterator();}

  // enable BOOST_FOREACH
------------------------------------------------------------//

  inline
  directory_iterator& range_begin(directory_iterator& iter) {return iter;}
  inline
  directory_iterator range_begin(const directory_iterator& iter) {return iter;}
  inline
  directory_iterator range_end(const directory_iterator&) {return
directory_iterator();}
  } // namespace filesystem

  // namespace boost template specializations
  template<>
  struct range_mutable_iterator<boost::filesystem::directory_iterator>
    { typedef boost::filesystem::directory_iterator type; };
  template<>
  struct range_const_iterator <boost::filesystem::directory_iterator>
    { typedef boost::filesystem::directory_iterator type; };


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk