Hello,

I'm trying to make an EDSL for finite volume method,
which translates a formula of the method into
executable code.

Now I've confirmed that such a formula

    std::cout << MyEDSL::opr( 0.1, 0.1) + 1.0 << std::endl;

can be compiled and prints out the correct answer.

But when I try to make a deep copy of the operator part
( MyEDSL::opr ) of that formula,


    auto copyOfOperator = proto::deep_copy( MyEDSL::opr );


g++ 4.8.4 issued lots of compilation error messages.

Those error messages and all of my source code  are
attached below.

Probably I missed something important to customize the expression
in my EDSL, but still cannot find out what it is. So could anybody
please look into my source and give me some advice or hint ?

Or could anybody please tell me about any detailed programming
guide for Boost.Proto?   I've read through Users Guide and
"Expressive C++" article series #1 - #8, but still cannot complete
my first EDSL .


Many thanks and best regards,
Masa

Masakatsu ITO


--------------------    beginning of my source code ------------------------


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


namespace mpl = boost::mpl;
namespace proto = boost::proto;

namespace MyEDSL {

    struct DifferenceOperator;

    struct ExprGrammar : proto::or_<
        proto::terminal< DifferenceOperator >
    > {};

    // A wrapper for a user defined expression
    template< typename E > struct ExprWrapper;

    // The above grammar is associated with this domain.
    struct Domain
        : proto::domain< proto::generator< ExprWrapper >, ExprGrammar >
    {};

    // A wrapper template for a user defined expression
    template< typename ExprType >
    struct ExprWrapper
        : proto::extends< ExprType, ExprWrapper< ExprType >, Domain >
    {

        explicit ExprWrapper(const ExprType& e)
            : proto::extends<ExprType, ExprWrapper<ExprType>, Domain>(e)
        {}
    };


    // A user defined expression
    struct DifferenceOperator
    {
        typedef double result_type;
        template <typename Sig> struct result;

        template < typename This, typename T >
        struct result< This(T, T) > { typedef double type; };

        explicit DifferenceOperator() {}
        DifferenceOperator( const DifferenceOperator & expr) {}

        double operator()( double dx1, double dx2) const {
            return ( 1.0 /dx1 + 1.0 /dx2 );
        }
    };

    static struct DifferenceOperator opr = {};


    // Define a trait for detecting linear algebraic terminals, to be used
    // by the BOOST_PROTO_DEFINE_OPERATORS macro below.
    template<typename> struct IsExpr  : mpl::false_ {};

    template<> struct IsExpr< DifferenceOperator > : mpl::true_  {};

    // This defines all the overloads to make expressions involving
    // Vector and Matrix objects to build Proto's expression templates.
    BOOST_PROTO_DEFINE_OPERATORS(IsExpr, Domain)
}


int main() {
    // This worked well.
    std::cout << MyEDSL::opr( 0.1, 0.1) + 1.0 << std::endl;

    // But this cannot be compiled.
    auto copyOfOperator = proto::deep_copy( MyEDSL::opr );

    return 0;
}

--------------------  end of my source code ------------------------

-------------------- beginning of compilation error messages ----------

$ g++ -std=c++11 protoDeepCopyUserDefinedExpr.cpp
In file included from /home/mito/usrLocal/include/boost/proto/core.hpp:27:0,
                 from /home/mito/usrLocal/include/boost/proto/proto.hpp:12,
                 from protoDeepCopyUserDefinedExpr.cpp:9:
/home/mito/usrLocal/include/boost/proto/deep_copy.hpp: In instantiation of 'struct 
boost::proto::result_of::deep_copy<MyEDSL::DifferenceOperator>':
/home/mito/usrLocal/include/boost/proto/deep_copy.hpp:128:5:   required by substitution of 
'template<class Expr> typename boost::proto::result_of::deep_copy<Expr>::type 
boost::proto::deep_copy(const Expr&) [with Expr = MyEDSL::DifferenceOperator]'
protoDeepCopyUserDefinedExpr.cpp:82:54:   required from here
/home/mito/usrLocal/include/boost/proto/deep_copy.hpp:67:13: error: 'proto_arity_c' 
is not a member of 
'boost::proto::detail::uncvref<MyEDSL::DifferenceOperator>::type {aka 
MyEDSL::DifferenceOperator}'
             type;
             ^
protoDeepCopyUserDefinedExpr.cpp: In function 'int main()':
protoDeepCopyUserDefinedExpr.cpp:82:54: error: no matching function for call to 
'deep_copy(MyEDSL::DifferenceOperator&)'
  auto copyOfOperator = proto::deep_copy( MyEDSL::opr );
                                                      ^
protoDeepCopyUserDefinedExpr.cpp:82:54: note: candidate is:
In file included from /home/mito/usrLocal/include/boost/proto/core.hpp:27:0,
                 from /home/mito/usrLocal/include/boost/proto/proto.hpp:12,
                 from protoDeepCopyUserDefinedExpr.cpp:9:
/home/mito/usrLocal/include/boost/proto/deep_copy.hpp:128:5: note: template<class Expr> 
typename boost::proto::result_of::deep_copy<Expr>::type boost::proto::deep_copy(const 
Expr&)
     deep_copy(Expr const &e)
     ^
/home/mito/usrLocal/include/boost/proto/deep_copy.hpp:128:5: note:   
substitution of deduced template arguments resulted in errors seen above


-------------------- end of compilation error messages ----------

_______________________________________________
proto mailing list
proto@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/proto

Reply via email to