// -*- C++ -*-
/*
- * File: array.h
* Purpose: A general purpose resizable array.
* Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
* Created: January 1996
* the GNU General Public Licence version 2 or later.
*/
-#include <string.h>
+#ifndef MATHEDARRAY_H
+#define MATHEDARRAY_H
-#ifndef byte
-#define byte unsigned char
+#include <vector>
+#include <iosfwd>
+#include "math_atom.h"
+
+class MathScriptInset;
+class MathMacro;
+class MathWriteInfo;
+class MathMetricsInfo;
+class LaTeXFeatures;
+
+#ifdef __GNUG__
+#pragma interface
#endif
-/** A resizable array.
- A general purpose resizable array.
- @author Alejandro Aguilar Sierra
- @version January 1996
+/** \class MathArray
+ \brief Low level container for math insets
+
+ \author Alejandro Aguilar Sierra
+ \author André Pönitz
+ \author Lars Gullik Bjønnes
+ \version February 2001
*/
-class LyxArrayBase {
+
+class MathArray {
public:
///
- enum {
- ///
- ARRAY_SIZE = 256,
- ///
- ARRAY_STEP = 16,
- ///
- ARRAY_MIN_SIZE = 4
- };
-
+ typedef std::vector<MathAtom> buffer_type;
///
- explicit
- LyxArrayBase(int size = ARRAY_STEP);
+ typedef buffer_type::const_iterator const_iterator;
///
- LyxArrayBase(LyxArrayBase const &);
+ typedef buffer_type::iterator iterator;
///
- ~LyxArrayBase();
-
- /// Constructs a new array with dx elements starting at pos
- LyxArrayBase & operator= (LyxArrayBase const &);
+ typedef buffer_type::size_type size_type;
+public:
///
- int empty() const { return (last == 0); }
-
+ MathArray();
///
- int Last() { return last; }
-
- /// Fills with 0 the entire array and set last to 0
- void Init();
-
- /// Make the allocated memory fit the needed size
- void Fit();
-
- /// Remove dx elements from position pos. Don't changes the size
- void Remove(int pos, int dx);
-
- /// Merge dx elements from array a at pos. Changes the size if necessary.
- void Merge(LyxArrayBase * a, int pos, int dx);
+ MathArray(MathArray const &, size_type from, size_type to);
- /// Same as Merge but doesn't changes the size (dangerous)
- void MergeF(LyxArrayBase * a, int pos, int dx);
-
- /// Copy dx byts from an array at position pos
- void Copy(void *, int pos, int dx);
-
- /// Constructs a new array with dx elements starting at pos
- LyxArrayBase * Extract(int pos, int dx);
-
- /// Insert a character at position pos
- void Insert(int pos, byte);
+ ///
+ size_type size() const;
+ ///
+ bool empty() const;
+ ///
+ void clear();
+ ///
+ void swap(MathArray &);
+
+ ///
+ void insert(size_type pos, MathAtom const &);
+ ///
+ void insert(size_type pos, MathArray const &);
- /// Insert a string of lenght dx at position pos
- void Insert(int pos, byte *, int dx);
+ ///
+ void erase(size_type pos1, size_type pos2);
+ ///
+ void erase(size_type pos);
+ ///
+ void erase();
- /// Constructs a new array with dx elements starting at pos
- byte operator[](const int);
+ ///
+ void push_back(MathAtom const &);
+ ///
+ void push_back(MathArray const &);
+ ///
+ void pop_back();
+ ///
+ MathAtom & back();
-protected:
///
- void Resize(int newsize);
+ void dump(std::ostream &) const;
+ ///
+ void dump2(std::ostream &) const;
///
- bool Move(int p, int shift);
+ void substitute(MathMacro const &);
- /// Buffer
- byte * bf;
- /// Last position inserted.
- int last;
- /// Max size of the array.
- int maxsize;
-private:
///
- friend class MathedIter;
+ MathAtom & at(size_type pos);
+ ///
+ MathAtom const & at(size_type pos) const;
+ ///
+ void write(MathWriteInfo & os) const;
+ ///
+ void writeNormal(std::ostream &) const;
+ ///
+ void validate(LaTeXFeatures &) const;
+ ///
+ const_iterator begin() const;
+ ///
+ const_iterator end() const;
+ ///
+ iterator begin();
+ ///
+ iterator end();
+ ///
+ MathScriptInset const * asScript(const_iterator it) const;
+private:
+ /// Buffer
+ buffer_type bf_;
};
-
-
-/************************ Inline functions *****************************/
-inline
-void LyxArrayBase::Init()
-{
- memset(bf, 0, maxsize);
- last = 0;
-}
+std::ostream & operator<<(std::ostream & os, MathArray const & ar);
-inline // Hmmm, Hp-UX's CC can't handle this inline. Asger.
-void LyxArrayBase::Resize(int newsize)
-{
- if (newsize<ARRAY_MIN_SIZE)
- newsize = ARRAY_MIN_SIZE;
- newsize += ARRAY_STEP - (newsize % ARRAY_STEP);
- byte *nwbf = new byte[newsize];
- if (last >= newsize) last = newsize-1;
- maxsize = newsize;
- memcpy(nwbf, bf, last);
- delete[] bf;
- bf = nwbf;
- bf[last] = 0;
-}
-
-inline
-LyxArrayBase::LyxArrayBase(int size)
-{
- maxsize = (size<ARRAY_MIN_SIZE) ? ARRAY_MIN_SIZE: size;
- bf = new byte[maxsize]; // this leaks
- Init();
-}
-
-inline
-LyxArrayBase::~LyxArrayBase()
-{
- delete[] bf;
-}
-
-inline
-LyxArrayBase::LyxArrayBase(const LyxArrayBase& a)
-{
- maxsize = a.maxsize;
- bf = new byte[maxsize];
- memcpy(&bf[0], &a.bf[0], maxsize);
- last = a.last;
-}
-
-inline
-LyxArrayBase& LyxArrayBase::operator= (const LyxArrayBase& a)
-{
- if (this != &a) {
- Resize(a.maxsize);
- memcpy(&bf[0], &a.bf[0], maxsize);
- }
- return *this;
-}
-
-inline
-bool LyxArrayBase::Move(int p, int shift)
-{
- bool result = false;
- if (p<= last) {
- if (last+shift>= maxsize) {
- Resize(last + shift);
- }
- memmove(&bf[p+shift], &bf[p], last-p);
- last += shift;
- bf[last] = 0;
- result = true;
- }
- return result;
-}
-
-inline
-void LyxArrayBase::Fit()
-{
- Resize(last);
-}
-
-inline
-void LyxArrayBase::Remove(int pos, int dx)
-{
- Move(pos+dx, -dx);
-}
-
-inline
-void LyxArrayBase::Merge(LyxArrayBase *a, int p, int dx)
-{
- Move(p, dx);
- memcpy(&bf[p], &a->bf[0], dx);
-}
-
-inline
-void LyxArrayBase::MergeF(LyxArrayBase *a, int p, int dx)
-{
- memcpy(&bf[p], &a->bf[0], dx);
-}
-
-inline
-void LyxArrayBase::Copy(void *a, int p, int dx)
-{
- memcpy(&bf[p], a, dx);
-}
-
-inline
-LyxArrayBase *LyxArrayBase::Extract(int, int dx)
-{
- LyxArrayBase *a = new LyxArrayBase(dx);
- a->Merge(this, 0, dx);
- return a;
-}
-
-inline
-byte LyxArrayBase::operator[](const int i)
-{
- return bf[i];
-}
-
-
-inline
-void LyxArrayBase::Insert(int pos, byte c)
-{
- if (pos<0) pos = last;
- if (pos>= maxsize)
- Resize(maxsize+ARRAY_STEP);
- bf[pos] = c;
- if (pos>= last)
- last = pos+1;
-}
+#endif