Boost logo

Boost Users :

Subject: Re: [Boost-users] [proto] generation of adaptive precision floating-point geometric predicates
From: Manjunath Kudlur (keveman_at_[hidden])
Date: 2010-03-19 19:51:00


> Here's where I'm stuck.  In the case of the expression (a + b)*(c - d), the
> addition and subtraction should be replaced by the appropriate sequences
> before the multiplication gets expanded to yield the final sequence:

See if the following works for you. I try to replace a # b with
sum(#_approx(a,b), #_error(a,b)). The display_expr looked correct, but
I didn't check very carefully.

#include <boost/proto/proto.hpp>
#include <iostream>

namespace proto = boost::proto;
using proto::_;

unsigned ids = 0;
struct var {
  unsigned id;
  var() {
    id = ids++;
  }
  friend std::ostream &operator<<(std::ostream &s, var v) {
    s << "V" << v.id;
    return s;
  }
};

struct sum_approx {
  friend std::ostream &operator<<(std::ostream &s, sum_approx) {
    s << "sum_approx";
    return s;
  }
};
struct sum_error {
  friend std::ostream &operator<<(std::ostream &s, sum_error) {
    s << "sum_error";
    return s;
  }
};

struct diff_approx {
  friend std::ostream &operator<<(std::ostream &s, diff_approx) {
    s << "diff_approx";
    return s;
  }
};
struct diff_error {
  friend std::ostream &operator<<(std::ostream &s, diff_error) {
    s << "diff_error";
    return s;
  }
};

struct prod_approx {
  friend std::ostream &operator<<(std::ostream &s, prod_approx) {
    s << "prod_approx";
    return s;
  }
};
struct prod_error {
  friend std::ostream &operator<<(std::ostream &s, prod_error) {
    s << "prod_error";
    return s;
  }
};

struct sum {
  friend std::ostream &operator<<(std::ostream &s, sum) {
    s << "sum";
    return s;
  }
};

struct grammar
  : proto::or_<
proto::when<proto::plus<grammar, grammar>,
proto::_make_function(sum(), proto::_make_function(sum_approx(),
grammar(proto::_left), grammar(proto::_right)),
                      proto::_make_function(sum_error(),
grammar(proto::_left), grammar(proto::_right)))>
,proto::when<proto::minus<grammar, grammar>,
 proto::_make_function(sum(), proto::_make_function(diff_approx(),
grammar(proto::_left), grammar(proto::_right)),
                       proto::_make_function(diff_error(),
grammar(proto::_left), grammar(proto::_right)))>
,proto::when<proto::multiplies<grammar, grammar>,
 proto::_make_function(sum(), proto::_make_function(prod_approx(),
grammar(proto::_left), grammar(proto::_right)),
                       proto::_make_function(prod_error(),
grammar(proto::_left), grammar(proto::_right)))>
, proto::terminal<var>
> {};

typedef proto::terminal<var>::type Var;

int main()
{
  Var a, b, c, d;

  proto::display_expr(grammar()(
                                (a+b)*(c-d)
                                          ));
}


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