]> git.lyx.org Git - lyx.git/blobdiff - src/mathed/array.h
use stream-like syntax for LaTeX output
[lyx.git] / src / mathed / array.h
index 88fc0ad24b699bfe73525c48f9bfe3bc91fff98f..db0f1d4ea5840f37ad044815c19a5c024c81958b 100644 (file)
 // -*- C++ -*-
 /*
- *  File:        array.h
  *  Purpose:     A general purpose resizable array.  
  *  Author:      Alejandro Aguilar Sierra <asierra@servidor.unam.mx> 
  *  Created:     January 1996
  *
  *  Dependencies: None (almost)
  *
- *  Copyright: (c) 1996, Alejandro Aguilar Sierra
+ *  Copyright: 1996, Alejandro Aguilar Sierra
  *                 1997  The LyX Team!
  *
  *   You are free to use and modify this code under the terms of
  *   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
 
-/*@Doc: A resizable array
-  Why is it called "LyXArrayBase" if it is generic? (Lgb)
-  Initially I thought it could be the base class for both mathed's
-  and LyX' kernels data buffer. (Ale)
+/** \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;
+       ///
+       typedef buffer_type::const_iterator  const_iterator;
+       ///
+       typedef buffer_type::iterator        iterator;
+       ///
+       typedef buffer_type::size_type       size_type;
 
+public:
        ///
-       LyxArrayBase(int size=ARRAY_STEP);
+       MathArray();
        ///
-       LyxArrayBase(const LyxArrayBase&);
+       MathArray(MathArray const &, size_type from, size_type to);
+
+       ///
+       size_type size() const;
+       ///
+       bool empty() const;
        ///
-       ~LyxArrayBase();
-   
+       void clear();
+       ///
+       void swap(MathArray &);
        
        ///
-       int Empty() { return (last==0); }
-   
+       void insert(size_type pos, MathAtom const &);
        ///
-       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); 
+       void insert(size_type pos, MathArray const &);
 
-       /// 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);
-
-       /// Insert a string of lenght dx at position pos
-       void Insert(int pos, byte *, int dx);
-
-       /// Constructs a new array with dx elements starting at pos 
-       byte operator[](const int);
+       ///
+       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 
-       LyxArrayBase& operator=(const LyxArrayBase&); 
+       ///
+       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 *****************************/
+std::ostream & operator<<(std::ostream & os, MathArray const & ar);
 
-inline
-void LyxArrayBase::Init()
-{
-       memset(bf, 0, maxsize);
-       last = 0;
-}
-
-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