Boost logo

Boost Users :

From: Daniel Wallin (daniel_at_[hidden])
Date: 2007-05-23 03:36:58


Joaquín Mª López Muñoz wrote:
>
> Scott Meyers ha escrito:
[...]
>> What I really want is something more like
>> do_until<Sequence>(unaryFunctionObject) that will loop over all the entries in
>> Sequence until the unaryFunctionObject returns true. Is there something like
>> this in the MPL, must I roll my own, or am I approaching this the wrong way
>> entirely?
>
> AFAIK you must roll your own. Please find attached a possible implementation
> using mpl::fold.

This is unnecessarily inefficient. It's pretty easy to just use
iterators, something like:

  template <class First, class Last, class F>
  bool do_until_impl(First, Last, F f)
  {
      boost::value_initialized<typename mpl::deref<First>::type> x;

      if (f(boost::get(x)))
          return true;

      return do_until_impl(
          typename mpl::next<First>::type(), Last(), f);
  }

  template <class Last, class F>
  bool do_until_impl(Last, Last, F)
  {
      return false;
  }

  template <class Seq, class F>
  bool do_until(F f)
  {
      return do_until_impl(
          typename mpl::begin<Seq>::type()
        , typename mpl::end<Seq>::type()
        , f
      );
  }

-- 
Daniel Wallin
Boost Consulting
www.boost-consulting.com

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net