From 3fb7166724ec9a4e5acac793f42c347da9aa9a87 Mon Sep 17 00:00:00 2001 From: Christian Bauer Date: Mon, 18 Aug 2003 20:29:52 +0000 Subject: [PATCH] added ex::const_iterator, ex::begin(), ex::end() --- ginac/Makefile.am | 7 ++- ginac/ex.h | 135 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+), 4 deletions(-) diff --git a/ginac/Makefile.am b/ginac/Makefile.am index a24a61c7..7fa8b6ed 100644 --- a/ginac/Makefile.am +++ b/ginac/Makefile.am @@ -5,10 +5,9 @@ libginac_la_SOURCES = add.cpp archive.cpp basic.cpp clifford.cpp color.cpp \ constant.cpp ex.cpp expair.cpp expairseq.cpp exprseq.cpp fail.cpp \ fderivative.cpp function.cpp idx.cpp indexed.cpp inifcns.cpp \ inifcns_trans.cpp inifcns_zeta.cpp inifcns_gamma.cpp inifcns_nstdsums.cpp \ - lst.cpp matrix.cpp \ - mul.cpp ncmul.cpp normal.cpp numeric.cpp operators.cpp power.cpp \ - registrar.cpp relational.cpp remember.cpp pseries.cpp print.cpp structure.cpp \ - symbol.cpp symmetry.cpp tensor.cpp utils.cpp wildcard.cpp \ + lst.cpp matrix.cpp mul.cpp ncmul.cpp normal.cpp numeric.cpp operators.cpp \ + power.cpp registrar.cpp relational.cpp remember.cpp pseries.cpp print.cpp \ + structure.cpp symbol.cpp symmetry.cpp tensor.cpp utils.cpp wildcard.cpp \ input_parser.yy input_lexer.ll \ input_lexer.h remember.h tostring.h utils.h libginac_la_LDFLAGS = -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ diff --git a/ginac/ex.h b/ginac/ex.h index d16bdbc1..30a009eb 100644 --- a/ginac/ex.h +++ b/ginac/ex.h @@ -24,6 +24,7 @@ #define __GINAC_EX_H__ #include +#include #include #include "basic.h" @@ -89,6 +90,140 @@ public: * Undefined symbols and other parser errors will throw an exception. */ ex(const std::string &s, const ex &l); +public: + // Iterators + class const_iterator : public std::iterator + { + friend class ex; + + public: + const_iterator() {} + const_iterator(const basic *bp_, size_t i_) : bp(bp_), i(i_) {} + + bool operator==(const const_iterator &other) const + { + return bp == other.bp && i == other.i; + } + + bool operator!=(const const_iterator &other) const + { + return !(*this == other); + } + + bool operator<(const const_iterator &other) const + { + return i < other.i; + } + + bool operator>(const const_iterator &other) const + { + return other < *this; + } + + bool operator<=(const const_iterator &other) const + { + return !(other < *this); + } + + bool operator>=(const const_iterator &other) const + { + return !(*this < other); + } + + // This should return an ex&, but that would be a reference to a + // temporary value + ex operator*() const + { + return bp->op(i); + } + +#if 0 + // How do we make this work in the context of the "reference to + // temporary" problem? Return an auto_ptr? + pointer operator->() const + { + return &(operator*()); + } +#endif + + const_iterator &operator++() + { + ++i; + return *this; + } + + const_iterator operator++(int) + { + const_iterator tmp = *this; + ++i; + return tmp; + } + + const_iterator &operator+=(difference_type n) + { + i += n; + return *this; + } + + const_iterator operator+(difference_type n) const + { + return const_iterator(bp, i + n); + } + + inline friend const_iterator operator+(difference_type n, const const_iterator &it) + { + return const_iterator(it.bp, it.i + n); + } + + const_iterator &operator--() + { + --i; + return *this; + } + + const_iterator operator--(int) + { + const_iterator tmp = *this; + --i; + return tmp; + } + + const_iterator &operator-=(difference_type n) + { + i -= n; + return *this; + } + + const_iterator operator-(difference_type n) const + { + return const_iterator(bp, i - n); + } + + inline friend difference_type operator-(const const_iterator &lhs, const const_iterator &rhs) + { + return lhs.i - rhs.i; + } + + reference operator[](difference_type n) const + { + } + + protected: + const basic *bp; + size_t i; + }; + + const_iterator begin() const { return const_iterator(get_pointer(bp), 0); } + const_iterator end() const { return const_iterator(get_pointer(bp), bp->nops()); } + +#if 0 + // This doesn't work because of the "reference to temporary" problem + // in operator*() + typedef std::reverse_iterator const_reverse_iterator; + const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); } + const_reverse_iterator rend() const { return const_reverse_iterator(begin()); } +#endif + // non-virtual functions in this class public: /** Efficiently swap the contents of two expressions. */ -- 2.44.0