-void ex::construct_from_int(int i)
-{
- switch (i) { // some tiny efficiency-hack
- case -2:
- bp = _ex_2().bp;
- ++bp->refcount;
- break;
- case -1:
- bp = _ex_1().bp;
- ++bp->refcount;
- break;
- case 0:
- bp = _ex0().bp;
- ++bp->refcount;
- break;
- case 1:
- bp = _ex1().bp;
- ++bp->refcount;
- break;
- case 2:
- bp = _ex2().bp;
- ++bp->refcount;
- break;
- default:
- bp = new numeric(i);
- bp->setflag(status_flags::dynallocated);
- ++bp->refcount;
- GINAC_ASSERT((bp->flags) & status_flags::dynallocated);
- GINAC_ASSERT(bp->refcount=1);
- }
-}
-
-void ex::construct_from_uint(unsigned int i)
-{
- switch (i) { // some tiny efficiency-hack
- case -2:
- bp = _ex_2().bp;
- ++bp->refcount;
- break;
- case -1:
- bp = _ex_1().bp;
- ++bp->refcount;
- break;
- case 0:
- bp = _ex0().bp;
- ++bp->refcount;
- break;
- case 1:
- bp = _ex1().bp;
- ++bp->refcount;
- break;
- case 2:
- bp = _ex2().bp;
- ++bp->refcount;
- break;
- default:
- bp = new numeric(i);
- bp->setflag(status_flags::dynallocated);
- ++bp->refcount;
- GINAC_ASSERT((bp->flags) & status_flags::dynallocated);
- GINAC_ASSERT(bp->refcount=1);
- }
-}
-
-void ex::construct_from_long(long i)
-{
- switch (i) { // some tiny efficiency-hack
- case -2:
- bp = _ex_2().bp;
- ++bp->refcount;
- break;
- case -1:
- bp = _ex_1().bp;
- ++bp->refcount;
- break;
- case 0:
- bp = _ex0().bp;
- ++bp->refcount;
- break;
- case 1:
- bp = _ex1().bp;
- ++bp->refcount;
- break;
- case 2:
- bp = _ex2().bp;
- ++bp->refcount;
- break;
- default:
- bp = new numeric(i);
- bp->setflag(status_flags::dynallocated);
- ++bp->refcount;
- GINAC_ASSERT((bp->flags) & status_flags::dynallocated);
- GINAC_ASSERT(bp->refcount=1);
- }
-}
-
-void ex::construct_from_ulong(unsigned long i)
-{
- switch (i) { // some tiny efficiency-hack
- case -2:
- bp = _ex_2().bp;
- ++bp->refcount;
- break;
- case -1:
- bp = _ex_1().bp;
- ++bp->refcount;
- break;
- case 0:
- bp = _ex0().bp;
- ++bp->refcount;
- break;
- case 1:
- bp = _ex1().bp;
- ++bp->refcount;
- break;
- case 2:
- bp = _ex2().bp;
- ++bp->refcount;
- break;
- default:
- bp = new numeric(i);
- bp->setflag(status_flags::dynallocated);
- ++bp->refcount;
- GINAC_ASSERT((bp->flags) & status_flags::dynallocated);
- GINAC_ASSERT(bp->refcount=1);
- }
-}
-
-void ex::construct_from_double(double d)
-{
- bp = new numeric(d);
- bp->setflag(status_flags::dynallocated);
- ++bp->refcount;
- GINAC_ASSERT((bp->flags) & status_flags::dynallocated);
- GINAC_ASSERT(bp->refcount=1);
-}
-
+ // The object is not heap-allocated, so we create a duplicate
+ // on the heap.
+ basic *bp = other.duplicate();
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return bp;
+ }
+ }
+}
+
+basic & ex::construct_from_int(int i)
+{
+ switch (i) { // prefer flyweights over new objects
+ case -12:
+ return const_cast<numeric &>(_num_12);
+ case -11:
+ return const_cast<numeric &>(_num_11);
+ case -10:
+ return const_cast<numeric &>(_num_10);
+ case -9:
+ return const_cast<numeric &>(_num_9);
+ case -8:
+ return const_cast<numeric &>(_num_8);
+ case -7:
+ return const_cast<numeric &>(_num_7);
+ case -6:
+ return const_cast<numeric &>(_num_6);
+ case -5:
+ return const_cast<numeric &>(_num_5);
+ case -4:
+ return const_cast<numeric &>(_num_4);
+ case -3:
+ return const_cast<numeric &>(_num_3);
+ case -2:
+ return const_cast<numeric &>(_num_2);
+ case -1:
+ return const_cast<numeric &>(_num_1);
+ case 0:
+ return const_cast<numeric &>(_num0);
+ case 1:
+ return const_cast<numeric &>(_num1);
+ case 2:
+ return const_cast<numeric &>(_num2);
+ case 3:
+ return const_cast<numeric &>(_num3);
+ case 4:
+ return const_cast<numeric &>(_num4);
+ case 5:
+ return const_cast<numeric &>(_num5);
+ case 6:
+ return const_cast<numeric &>(_num6);
+ case 7:
+ return const_cast<numeric &>(_num7);
+ case 8:
+ return const_cast<numeric &>(_num8);
+ case 9:
+ return const_cast<numeric &>(_num9);
+ case 10:
+ return const_cast<numeric &>(_num10);
+ case 11:
+ return const_cast<numeric &>(_num11);
+ case 12:
+ return const_cast<numeric &>(_num12);
+ default:
+ basic *bp = new numeric(i);
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return *bp;
+ }
+}
+
+basic & ex::construct_from_uint(unsigned int i)
+{
+ switch (i) { // prefer flyweights over new objects
+ case 0:
+ return const_cast<numeric &>(_num0);
+ case 1:
+ return const_cast<numeric &>(_num1);
+ case 2:
+ return const_cast<numeric &>(_num2);
+ case 3:
+ return const_cast<numeric &>(_num3);
+ case 4:
+ return const_cast<numeric &>(_num4);
+ case 5:
+ return const_cast<numeric &>(_num5);
+ case 6:
+ return const_cast<numeric &>(_num6);
+ case 7:
+ return const_cast<numeric &>(_num7);
+ case 8:
+ return const_cast<numeric &>(_num8);
+ case 9:
+ return const_cast<numeric &>(_num9);
+ case 10:
+ return const_cast<numeric &>(_num10);
+ case 11:
+ return const_cast<numeric &>(_num11);
+ case 12:
+ return const_cast<numeric &>(_num12);
+ default:
+ basic *bp = new numeric(i);
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return *bp;
+ }
+}
+
+basic & ex::construct_from_long(long i)
+{
+ switch (i) { // prefer flyweights over new objects
+ case -12:
+ return const_cast<numeric &>(_num_12);
+ case -11:
+ return const_cast<numeric &>(_num_11);
+ case -10:
+ return const_cast<numeric &>(_num_10);
+ case -9:
+ return const_cast<numeric &>(_num_9);
+ case -8:
+ return const_cast<numeric &>(_num_8);
+ case -7:
+ return const_cast<numeric &>(_num_7);
+ case -6:
+ return const_cast<numeric &>(_num_6);
+ case -5:
+ return const_cast<numeric &>(_num_5);
+ case -4:
+ return const_cast<numeric &>(_num_4);
+ case -3:
+ return const_cast<numeric &>(_num_3);
+ case -2:
+ return const_cast<numeric &>(_num_2);
+ case -1:
+ return const_cast<numeric &>(_num_1);
+ case 0:
+ return const_cast<numeric &>(_num0);
+ case 1:
+ return const_cast<numeric &>(_num1);
+ case 2:
+ return const_cast<numeric &>(_num2);
+ case 3:
+ return const_cast<numeric &>(_num3);
+ case 4:
+ return const_cast<numeric &>(_num4);
+ case 5:
+ return const_cast<numeric &>(_num5);
+ case 6:
+ return const_cast<numeric &>(_num6);
+ case 7:
+ return const_cast<numeric &>(_num7);
+ case 8:
+ return const_cast<numeric &>(_num8);
+ case 9:
+ return const_cast<numeric &>(_num9);
+ case 10:
+ return const_cast<numeric &>(_num10);
+ case 11:
+ return const_cast<numeric &>(_num11);
+ case 12:
+ return const_cast<numeric &>(_num12);
+ default:
+ basic *bp = new numeric(i);
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return *bp;
+ }
+}
+
+basic & ex::construct_from_ulong(unsigned long i)
+{
+ switch (i) { // prefer flyweights over new objects
+ case 0:
+ return const_cast<numeric &>(_num0);
+ case 1:
+ return const_cast<numeric &>(_num1);
+ case 2:
+ return const_cast<numeric &>(_num2);
+ case 3:
+ return const_cast<numeric &>(_num3);
+ case 4:
+ return const_cast<numeric &>(_num4);
+ case 5:
+ return const_cast<numeric &>(_num5);
+ case 6:
+ return const_cast<numeric &>(_num6);
+ case 7:
+ return const_cast<numeric &>(_num7);
+ case 8:
+ return const_cast<numeric &>(_num8);
+ case 9:
+ return const_cast<numeric &>(_num9);
+ case 10:
+ return const_cast<numeric &>(_num10);
+ case 11:
+ return const_cast<numeric &>(_num11);
+ case 12:
+ return const_cast<numeric &>(_num12);
+ default:
+ basic *bp = new numeric(i);
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return *bp;
+ }
+}
+
+basic & ex::construct_from_double(double d)
+{
+ basic *bp = new numeric(d);
+ bp->setflag(status_flags::dynallocated);
+ GINAC_ASSERT(bp->get_refcount() == 0);
+ return *bp;
+}
+
+ptr<basic> ex::construct_from_string_and_lst(const std::string &s, const ex &l)
+{
+ set_lexer_string(s);
+ set_lexer_symbols(l);
+ ginac_yyrestart(NULL);
+ if (ginac_yyparse())
+ throw (std::runtime_error(get_parser_error()));
+ else
+ return parsed_ex.bp;
+}
+