/*
Copyright (C) 2013 Tom Bachmann
This file is part of FLINT.
FLINT is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License (LGPL) as published
by the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version. See .
*/
#include "flintxx/ltuple.h"
#include "fmpzxx.h"
#include "flintxx/test/helpers.h"
#include "flintxx/test/myint.h"
using namespace flint;
void
test_traits()
{
tassert(!traits::is_ltuple_expr::val);
tassert(!traits::is_ltuple_expr::val);
}
namespace flint {
typedef make_ltuple::type>::type fmpzxxint_pair;
typedef make_ltuple::type>::type mylongint_pair;
FLINT_DEFINE_BINOP(make_lazy_test)
namespace rules {
FLINT_DEFINE_BINARY_EXPR_COND2(make_lazy_test_op, fmpzxxint_pair,
FMPZXX_COND_S, traits::is_signed_integer,
to.template get<0>() = e1;to.template get<1>() = e2)
FLINT_DEFINE_BINARY_EXPR2(make_lazy_test_op, mylongint_pair,
mylong, int,
to.template get<0>() = e1;to.template get<1>() = e2)
}
}
void
test_equals()
{
typedef mp::make_tuple maker;
typedef mp::make_tuple refmaker;
typedef mp::make_tuple srcrefmaker;
typedef make_ltuple lmaker;
typedef make_ltuple lrefmaker;
typedef make_ltuple lsrcrefmaker;
fmpzxx f;
int a = 12345;
lmaker::type ltuple(detail::INSTANTIATE_FROM_TUPLE(),
maker::make(fmpzxx(1), 2));
lrefmaker::ref_type lref(detail::INSTANTIATE_FROM_TUPLE(), refmaker::make(f, a));
lsrcrefmaker::srcref_type lsrcref(detail::INSTANTIATE_FROM_TUPLE(), srcrefmaker::make(
ltuple._data().inner.head, ltuple._data().inner.tail.head));
tassert(ltuple == ltuple);
tassert(ltuple != lref);
tassert(ltuple == lsrcref);
tassert(lref != lsrcref);
f = 1;
a = 2;
tassert(ltuple == lref);
tassert(lref == lsrcref);
tassert(ltuple == make_lazy_test(fmpzxx(1), 2));
}
void
test_assignment()
{
typedef mp::make_tuple maker;
typedef mp::make_tuple refmaker;
typedef mp::make_tuple srcrefmaker;
typedef make_ltuple lmaker;
fmpzxx f;
int a;
lmaker::type ltuple(detail::INSTANTIATE_FROM_TUPLE(),
maker::make(fmpzxx(1), 2));
lmaker::ref_type lref(detail::INSTANTIATE_FROM_TUPLE(), refmaker::make(f, a));
lref = ltuple;
tassert(f == 1 && a == 2);
f = 0;
a = 0;
lmaker::srcref_type lsrcref(detail::INSTANTIATE_FROM_TUPLE(), srcrefmaker::make(
ltuple._data().inner.head, ltuple._data().inner.tail.head));
ltuple._data().inner.head = 17;
lref = lsrcref;
tassert(f == 17 && a == 2);
f = 3;
a = 4;
ltuple = lref;
tassert(ltuple._data().inner.head == 3
&& ltuple._data().inner.tail.head == 4);
lref = make_lazy_test(fmpzxx(17), 18);
tassert(f == 17 && a == 18);
}
void
test_ltupleref()
{
fmpzxx a, b;
int c;
ltupleref(c) = ltuple(2);
tassert(c == 2);
ltupleref(a, c) = ltuple(fmpzxx(3), 4);
tassert(a == 3 && c == 4);
// test assignment with type conversion
ltupleref(a, b, c) = ltuple(1, 2, 4u);
tassert(a == 1 && b == 2 && c == 4);
// test assignment with c-style references
ltuple(fmpzxx_ref(a)) = ltuple(b);
tassert(a == 2);
}
template
bool is_lazy(const T&)
{
return traits::is_lazy_expr::val;
}
void
test_get()
{
fmpzxx a(1); int b = 2;
tassert(ltuple(a, b).get<0>() == a && ltuple(a, b).get<1>() == b);
ltupleref(a, b).get<0>() = 17;
ltupleref(a, b).get<1>() = 15;
tassert(a == 17 && b == 15);
tassert(make_lazy_test(a, 3).get<0>() == 17);
tassert(is_lazy(make_lazy_test(a, 3).get<0>()));
tassert(make_lazy_test(a, 3).get<1>() == 3);
}
void
test_placeholder()
{
fmpzxx a; int b;
ltupleref(a, _) = make_lazy_test(fmpzxx(17), 5);
tassert(a == 17);
ltupleref(_, b) = make_lazy_test(fmpzxx(18), 6);
tassert(b == 6 && a == 17);
ltupleref(_, _) = make_lazy_test(fmpzxx(1), 2);
tassert(b == 6 && a == 17);
}
void
test_create_temporaries()
{
tassert(make_lazy_test(mylong(1), 2).get<0>() == mylong(1));
}
int
main()
{
std::cout << "ltuple....";
test_traits();
test_equals();
test_assignment();
test_ltupleref();
test_get();
test_placeholder();
test_create_temporaries();
std::cout << "PASS" << std::endl;
return 0;
}