From: Richard Kreckel Date: Sun, 1 Nov 2015 19:16:12 +0000 (+0100) Subject: Remove dependence on depreacted std::auto_ptr. X-Git-Tag: release_1-7-0~7^2~73 X-Git-Url: https://www.ginac.de/ginac.git//ginac.git?p=ginac.git;a=commitdiff_plain;h=7d2c44606a17c76f6bec520c22eba96fa5875961 Remove dependence on depreacted std::auto_ptr. Most of the auto_ptr were introduced to avoid copying. C++11 supports move semantics for this. Some other can be replaced by std::unique_ptr. --- diff --git a/ginac/add.cpp b/ginac/add.cpp index 9110491e..36bb2011 100644 --- a/ginac/add.cpp +++ b/ginac/add.cpp @@ -86,11 +86,10 @@ add::add(const epvector & v, const ex & oc) GINAC_ASSERT(is_canonical()); } -add::add(std::auto_ptr vp, const ex & oc) +add::add(epvector && vp, const ex & oc) { - GINAC_ASSERT(vp.get()!=0); overall_coeff = oc; - construct_from_epvector(*vp); + construct_from_epvector(std::move(vp)); GINAC_ASSERT(is_canonical()); } @@ -306,8 +305,8 @@ int add::ldegree(const ex & s) const ex add::coeff(const ex & s, int n) const { - std::auto_ptr coeffseq(new epvector); - std::auto_ptr coeffseq_cliff(new epvector); + epvector coeffseq; + epvector coeffseq_cliff; int rl = clifford_max_label(s); bool do_clifford = (rl != -1); bool nonscalar = false; @@ -319,18 +318,18 @@ ex add::coeff(const ex & s, int n) const if (!restcoeff.is_zero()) { if (do_clifford) { if (clifford_max_label(restcoeff) == -1) { - coeffseq_cliff->push_back(combine_ex_with_coeff_to_pair(ncmul(restcoeff, dirac_ONE(rl)), i->coeff)); + coeffseq_cliff.push_back(combine_ex_with_coeff_to_pair(ncmul(restcoeff, dirac_ONE(rl)), i->coeff)); } else { - coeffseq_cliff->push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff)); + coeffseq_cliff.push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff)); nonscalar = true; } } - coeffseq->push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff)); + coeffseq.push_back(combine_ex_with_coeff_to_pair(restcoeff, i->coeff)); } ++i; } - return (new add(nonscalar ? coeffseq_cliff : coeffseq, + return (new add(nonscalar ? std::move(coeffseq_cliff) : std::move(coeffseq), n==0 ? overall_coeff : _ex0))->setflag(status_flags::dynallocated); } @@ -343,13 +342,13 @@ ex add::coeff(const ex & s, int n) const * @param level cut-off in recursive evaluation */ ex add::eval(int level) const { - std::auto_ptr evaled_seqp = evalchildren(level); - if (evaled_seqp.get()) { + epvector evaled = evalchildren(level); + if (!evaled.empty()) { // do more evaluation later - return (new add(evaled_seqp, overall_coeff))-> - setflag(status_flags::dynallocated); + return (new add(std::move(evaled), overall_coeff))-> + setflag(status_flags::dynallocated); } - + #ifdef DO_GINAC_ASSERT epvector::const_iterator i = seq.begin(), end = seq.end(); while (i != end) { @@ -386,18 +385,18 @@ ex add::eval(int level) const ++j; } if (terms_to_collect) { - std::auto_ptr s(new epvector); - s->reserve(seq_size - terms_to_collect); + epvector s; + s.reserve(seq_size - terms_to_collect); numeric oc = *_num1_p; j = seq.begin(); while (j != last) { if (unlikely(is_a(j->rest))) oc = oc.mul(ex_to(j->rest)).mul(ex_to(j->coeff)); else - s->push_back(*j); + s.push_back(*j); ++j; } - return (new add(s, ex_to(overall_coeff).add_dyn(oc))) + return (new add(std::move(s), ex_to(overall_coeff).add_dyn(oc))) ->setflag(status_flags::dynallocated); } @@ -408,8 +407,8 @@ ex add::evalm() const { // Evaluate children first and add up all matrices. Stop if there's one // term that is not a matrix. - std::auto_ptr s(new epvector); - s->reserve(seq.size()); + epvector s; + s.reserve(seq.size()); bool all_matrices = true; bool first_term = true; @@ -418,7 +417,7 @@ ex add::evalm() const epvector::const_iterator it = seq.begin(), itend = seq.end(); while (it != itend) { const ex &m = recombine_pair_to_ex(*it).evalm(); - s->push_back(split_ex_to_pair(m)); + s.push_back(split_ex_to_pair(m)); if (is_a(m)) { if (first_term) { sum = ex_to(m); @@ -433,7 +432,7 @@ ex add::evalm() const if (all_matrices) return sum + overall_coeff; else - return (new add(s, overall_coeff))->setflag(status_flags::dynallocated); + return (new add(std::move(s), overall_coeff))->setflag(status_flags::dynallocated); } ex add::conjugate() const @@ -512,18 +511,18 @@ ex add::eval_ncmul(const exvector & v) const * @see ex::diff */ ex add::derivative(const symbol & y) const { - std::auto_ptr s(new epvector); - s->reserve(seq.size()); + epvector s; + s.reserve(seq.size()); // Only differentiate the "rest" parts of the expairs. This is faster // than the default implementation in basic::derivative() although // if performs the same function (differentiate each term). epvector::const_iterator i = seq.begin(), end = seq.end(); while (i != end) { - s->push_back(combine_ex_with_coeff_to_pair(i->rest.diff(y), i->coeff)); + s.push_back(combine_ex_with_coeff_to_pair(i->rest.diff(y), i->coeff)); ++i; } - return (new add(s, _ex0))->setflag(status_flags::dynallocated); + return (new add(std::move(s), _ex0))->setflag(status_flags::dynallocated); } int add::compare_same_type(const basic & other) const @@ -554,9 +553,9 @@ ex add::thisexpairseq(const epvector & v, const ex & oc, bool do_index_renaming) } // Note: do_index_renaming is ignored because it makes no sense for an add. -ex add::thisexpairseq(std::auto_ptr vp, const ex & oc, bool do_index_renaming) const +ex add::thisexpairseq(epvector && vp, const ex & oc, bool do_index_renaming) const { - return (new add(vp,oc))->setflag(status_flags::dynallocated); + return (new add(std::move(vp), oc))->setflag(status_flags::dynallocated); } expair add::split_ex_to_pair(const ex & e) const @@ -624,13 +623,12 @@ ex add::recombine_pair_to_ex(const expair & p) const ex add::expand(unsigned options) const { - std::auto_ptr vp = expandchildren(options); - if (vp.get() == 0) { - // the terms have not changed, so it is safe to declare this expanded + epvector expanded = expandchildren(options); + if (expanded.empty()) return (options == 0) ? setflag(status_flags::expanded) : *this; - } - return (new add(vp, overall_coeff))->setflag(status_flags::dynallocated | (options == 0 ? status_flags::expanded : 0)); + return (new add(std::move(expanded), overall_coeff))->setflag(status_flags::dynallocated | + (options == 0 ? status_flags::expanded : 0)); } } // namespace GiNaC diff --git a/ginac/add.h b/ginac/add.h index 3127eaf6..db9bda9d 100644 --- a/ginac/add.h +++ b/ginac/add.h @@ -41,7 +41,7 @@ public: add(const exvector & v); add(const epvector & v); add(const epvector & v, const ex & oc); - add(std::auto_ptr vp, const ex & oc); + add(epvector && vp, const ex & oc); // functions overriding virtual functions from base classes public: @@ -68,7 +68,7 @@ protected: unsigned return_type() const; return_type_t return_type_tinfo() const; ex thisexpairseq(const epvector & v, const ex & oc, bool do_index_renaming = false) const; - ex thisexpairseq(std::auto_ptr vp, const ex & oc, bool do_index_renaming = false) const; + ex thisexpairseq(epvector && vp, const ex & oc, bool do_index_renaming = false) const; expair split_ex_to_pair(const ex & e) const; expair combine_ex_with_coeff_to_pair(const ex & e, const ex & c) const; diff --git a/ginac/clifford.cpp b/ginac/clifford.cpp index 1e93767d..eb94e0bf 100644 --- a/ginac/clifford.cpp +++ b/ginac/clifford.cpp @@ -109,7 +109,7 @@ clifford::clifford(unsigned char rl, const ex & metr, int comm_sign, const exvec { } -clifford::clifford(unsigned char rl, const ex & metr, int comm_sign, std::auto_ptr vp) : inherited(not_symmetric(), vp), representation_label(rl), metric(metr), commutator_sign(comm_sign) +clifford::clifford(unsigned char rl, const ex & metr, int comm_sign, exvector && v) : inherited(not_symmetric(), std::move(v)), representation_label(rl), metric(metr), commutator_sign(comm_sign) { } @@ -685,9 +685,9 @@ ex clifford::thiscontainer(const exvector & v) const return clifford(representation_label, metric, commutator_sign, v); } -ex clifford::thiscontainer(std::auto_ptr vp) const +ex clifford::thiscontainer(exvector && v) const { - return clifford(representation_label, metric, commutator_sign, vp); + return clifford(representation_label, metric, commutator_sign, std::move(v)); } ex diracgamma5::conjugate() const diff --git a/ginac/clifford.h b/ginac/clifford.h index ea34a9b4..bb3a7fec 100644 --- a/ginac/clifford.h +++ b/ginac/clifford.h @@ -47,7 +47,7 @@ public: // internal constructors clifford(unsigned char rl, const ex & metr, int comm_sign, const exvector & v, bool discardable = false); - clifford(unsigned char rl, const ex & metr, int comm_sign, std::auto_ptr vp); + clifford(unsigned char rl, const ex & metr, int comm_sign, exvector && v); // functions overriding virtual functions from base classes public: @@ -58,7 +58,7 @@ protected: ex eval_ncmul(const exvector & v) const; bool match_same_type(const basic & other) const; ex thiscontainer(const exvector & v) const; - ex thiscontainer(std::auto_ptr vp) const; + ex thiscontainer(exvector && v) const; unsigned return_type() const { return return_types::noncommutative; } return_type_t return_type_tinfo() const; // non-virtual functions in this class diff --git a/ginac/color.cpp b/ginac/color.cpp index 9a0d3534..09e52517 100644 --- a/ginac/color.cpp +++ b/ginac/color.cpp @@ -90,7 +90,7 @@ color::color(unsigned char rl, const exvector & v, bool discardable) : inherited { } -color::color(unsigned char rl, std::auto_ptr vp) : inherited(not_symmetric(), vp), representation_label(rl) +color::color(unsigned char rl, exvector && v) : inherited(not_symmetric(), std::move(v)), representation_label(rl) { } @@ -184,9 +184,9 @@ ex color::thiscontainer(const exvector & v) const return color(representation_label, v); } -ex color::thiscontainer(std::auto_ptr vp) const +ex color::thiscontainer(exvector && v) const { - return color(representation_label, vp); + return color(representation_label, std::move(v)); } /** Given a vector iv3 of three indices and a vector iv2 of two indices that diff --git a/ginac/color.h b/ginac/color.h index 26eed02c..e4a11e4a 100644 --- a/ginac/color.h +++ b/ginac/color.h @@ -47,7 +47,7 @@ public: // internal constructors color(unsigned char rl, const exvector & v, bool discardable = false); - color(unsigned char rl, std::auto_ptr vp); + color(unsigned char rl, exvector && v); void archive(archive_node& n) const; void read_archive(const archive_node& n, lst& sym_lst); @@ -56,7 +56,7 @@ protected: ex eval_ncmul(const exvector & v) const; bool match_same_type(const basic & other) const; ex thiscontainer(const exvector & v) const; - ex thiscontainer(std::auto_ptr vp) const; + ex thiscontainer(exvector && v) const; unsigned return_type() const { return return_types::noncommutative; } return_type_t return_type_tinfo() const; diff --git a/ginac/container.h b/ginac/container.h index 0c36f7cb..6cdc7cb7 100644 --- a/ginac/container.h +++ b/ginac/container.h @@ -152,10 +152,10 @@ public: this->seq = s; } - explicit container(std::auto_ptr vp) + explicit container(STLT && v) { setflag(get_default_flags()); - this->seq.swap(*vp); + this->seq.swap(v); } container(exvector::const_iterator b, exvector::const_iterator e) @@ -450,8 +450,8 @@ protected: virtual ex thiscontainer(const STLT & v) const { return container(v); } /** Similar to duplicate(), but with a preset sequence (which gets - * deleted). Must be overridden by derived classes. */ - virtual ex thiscontainer(std::auto_ptr vp) const { return container(vp); } + * pilfered). Must be overridden by derived classes. */ + virtual ex thiscontainer(STLT && v) const { return container(std::move(v)); } virtual void printseq(const print_context & c, char openbracket, char delim, char closebracket, unsigned this_precedence, @@ -495,7 +495,7 @@ protected: void do_print_python(const print_python & c, unsigned level) const; void do_print_python_repr(const print_python_repr & c, unsigned level) const; STLT evalchildren(int level) const; - std::auto_ptr subschildren(const exmap & m, unsigned options = 0) const; + STLT subschildren(const exmap & m, unsigned options = 0) const; }; /** Default constructor */ @@ -582,9 +582,9 @@ ex container::subs(const exmap & m, unsigned options) const // f(x).subs(x==f^-1(x)) // -> f(f^-1(x)) [subschildren] // -> x [eval] /* must not subs(x==f^-1(x))! */ - std::auto_ptr vp = subschildren(m, options); - if (vp.get()) { - ex result(thiscontainer(vp)); + STLT subsed = subschildren(m, options); + if (!subsed.empty()) { + ex result(thiscontainer(subsed)); if (is_a >(result)) return ex_to(result).subs_one_level(m, options); else @@ -751,11 +751,10 @@ typename container::STLT container::evalchildren(int level) const } template