Hello,
I'm wondering if it would be appropriate to treat the fundamental types
(char, short, int, double, ...) by value, by default.
I wrote this simple piece of code.
I'm not sure if I'm leaving without considering any other implication, but
I think it may be an improvement.
Please, tell me if I am wrong.
Thanks and regards,
Fernando Pelliccioni.
//BEGIN CODE
**
#include boost/proto/proto.hpp
namespace math
{
template typename T
struct dynamic_matrix
{
dynamic_matrix(std::size_t x_lenght, std::size_t y_lenght)
{
//...
}
//Expensive Copy Constructor!!
//...
};
} // namespace math
using namespace boost;
//-
#define BOOST_PROTO_DEFINE_BINARY_OPERATOR_PRIMITIVE(OP, TAG, TRAIT,
DOMAIN, PRIMITIVE)\
templatetypename Left
\
BOOST_FORCEINLINE
\
typename boost::proto::detail::enable_binary
\
DOMAIN
\
, DOMAIN::proto_grammar
\
, BOOST_PROTO_APPLY_BINARY_(TRAIT, Left, PRIMITIVE)
\
, TAG
\
, Left const
\
, PRIMITIVE
\
::type const
\
operator OP(Left left, PRIMITIVE right)
\
{
\
return boost::proto::detail::make_expr_TAG, DOMAIN, Left const ,
PRIMITIVE()(left, right);\
}
\
templatetypename Right
\
BOOST_FORCEINLINE
\
typename boost::proto::detail::enable_binary
\
DOMAIN
\
, DOMAIN::proto_grammar
\
, BOOST_PROTO_APPLY_BINARY_(TRAIT, PRIMITIVE, Right)
\
, TAG
\
, PRIMITIVE
\
, Right const
\
::type const
\
operator OP(PRIMITIVE left, Right right)
\
{
\
return boost::proto::detail::make_expr_TAG, DOMAIN, PRIMITIVE, Right
const ()(left, right); \
}
/**/
//-
namespace math
{
template typename T
struct is_terminal
: mpl::false_
{};
template typename U
struct is_terminaldynamic_matrixU
: mpl::true_
{};
BOOST_PROTO_DEFINE_OPERATORS(is_terminal, proto::default_domain)
BOOST_PROTO_DEFINE_BINARY_OPERATOR_PRIMITIVE(*,
boost::proto::tag::multiplies, is_terminal, proto::default_domain, int)
} //namespace math
int main( /* int argc, char* argv[] */ )
{
using math::dynamic_matrix;
dynamic_matrixint m1(5, 5); //define the x and y size of the
matrix
dynamic_matrixint m2(5, 5);
auto e = m1 + m2; // m1 and m2 are held by reference
auto e2 = m1 * m2; // m1 and m2 are held by reference
auto e3 = m1 * 5; // m1 is held by reference. 5 is
held by value - NO dangling references
auto e4 = proto::deep_copy(m1 * m2);// Expensive copy of m1 and m2
auto e5 = proto::deep_copy(m1 * 5); // Expensive copy of m1
auto e6 = m1 + m2 * 5; // m1 and m2 are held by
reference. 5 is held by value - NO dangling references
auto e7 = m1 + m2 + dynamic_matrixint(5, 5); //dangling reference - I
don't care - Needed deep_copy
return 0;
}
//END CODE
**
___
proto mailing list
proto@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/proto