Boost logo

Boost :

From: Reece Dunn (msclrhd_at_[hidden])
Date: 2004-11-28 11:50:31


Joel de Guzman wrote:
> Hi,
>
> Hi. Here's a preview of Phoenix V2. This will probably be the last
> release of the library. Phoenix V2 will be the basis of the Phoenix
> and Boost.Lambda merger.
>
> You can get it here:
> http://spirit.sourceforge.net/dl_more/phoenix-2.zip

I like it!

> You can browse the draft docs here:
> http://tinyurl.com/6crgp

There is a typeo in the table at composite.html#phoenix.operator:

Include Files:

    #include <boost/spirit/phoenix/operator/self.hppp>
---------------------------------------------------^

> What's new? A lot. This is a total rewrite based on earlier
> discussions with Jaakko Jarvi. The library's is built on
> top of Fusion and of course MPL.
>
> Of particular interest are local variables and lambda-lambda
> scopes: http://tinyurl.com/3mn6w
>
> There is also a set of lazy functions that work on STL
> sequences (e.g. push_back etc.): http://tinyurl.com/46bbm
>
> and pretty soon, a final TODO item (built on top of scopes/
> lambda), lazy STL algorithms (e.g. find_if, etc). The scopes
> section (link provided above) in the docs illustrates how to
> write lazy functions that accept higher order functions
> (e.g. for_each).

I have written lazy veraions of pair.first and pair.second (see attachment).

Regards,
Reece


// (C) Copyright 2004: Reece H. Dunn. Distributed under the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#ifndef BOOST_SPIRIT_PHOENIX_STL_UTILITY_HPP
#define BOOST_SPIRIT_PHOENIX_STL_UTILITY_HPP

#include <boost/spirit/phoenix/function/function.hpp>

namespace boost { namespace phoenix
{

namespace stl
{
   template< typename C >
   struct first_type_of{ typedef typename C::first_type type; };

   template< typename C >
   struct second_type_of{ typedef typename C::second_type type; };

   struct first
   {
      template< typename C >
      struct apply
      {
         typedef typename first_type_of< C >::type & type;
      };

      template< typename C >
      typename apply< C >::type
      operator()( C & c ) const
      {
         return c.first;
      }
   };

   struct second
   {
      template< typename C >
      struct apply
      {
         typedef typename second_type_of< C >::type & type;
      };

      template< typename C >
      typename apply< C >::type
      operator()( C & c ) const
      {
         return c.second;
      }
   };
}

/** Get the first item in a pair.
  * The standard way of accessing the first item in a pair is to use the
  * p.first syntax. This will not work in a lazy context:
  * arg1.first; // error: first not a member of arg1.
  * To make this work in a lazy context, you need to use the first function:
  * first( arg1 ); // lazy evaluation.
  */

function< stl::first > const first = stl::first();

/** Get the second item in a pair.
  * The standard way of accessing the second item in a pair is to use the
  * p.second syntax. This will not work in a lazy context:
  * arg1.second; // error: second not a member of arg1.
  * To make this work in a lazy context, you need to use the second function:
  * second( arg1 ); // lazy evaluation.
  */

function< stl::second > const second = stl::second();

}}

#endif


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