#include "math_iter.h"
#include "math_inset.h"
-// Is this still needed? (Lgb)
+#include "support/LOstream.h"
+
+using std::ostream;
+using std::endl;
+
static inline
void * my_memcpy(void * ps_in, void const * pt_in, size_t n)
{
MathedArray::MathedArray()
- : bf_(1, 0), last_(0)
+ : bf_(1, '\0'), last_(0)
{}
+
MathedArray::~MathedArray()
{
// deep destruction
last_ = array.last_;
// deep copy
- // we'll not yet get exeption safety
- MathedIter it;
- it.SetData(this);
+ deep_copy();
+}
+
+void MathedArray::deep_copy()
+{
+ MathedIter it(this);
while (it.OK()) {
if (it.IsInset()) {
MathedInset * inset = it.GetInset();
inset = inset->Clone();
- raw_pointer_insert(inset, it.getPos() + 1, sizeof(inset));
+ raw_pointer_insert(inset, it.getPos() + 1);
}
it.Next();
}
return *this;
}
+void MathedArray::clear()
+{
+ last_ = 0;
+ bf_.resize(1);
+ bf_[0] = 0;
+}
+
void MathedArray::swap(MathedArray & array)
{
if (this != &array) {
}
+
+void MathedArray::shrink(int pos1, int pos2)
+{
+ if (pos1 == 0 && pos2 >= last())
+ return;
+
+ short fc = 0;
+ if (pos1 > 0 && bf_[pos1] > ' ') {
+ for (int p = pos1; p >= 0; --p) {
+ if (MathIsFont(bf_[p])) {
+ if (p != pos1 - 1)
+ fc = bf_[p];
+ else
+ --pos1;
+ break;
+ }
+ }
+ }
+
+ if (pos2 > 0 && bf_[pos2] >= ' ' && MathIsFont(bf_[pos2 - 1]))
+ --pos2;
+
+ int dx = pos2 - pos1;
+ MathedArray a;
+ a.resize(dx + 1);
+ strange_copy(&a, (fc) ? 1 : 0, pos1, dx);
+ if (fc) {
+ a[0] = fc;
+ ++dx;
+ }
+ a.last(dx);
+ a[dx] = '\0';
+
+ swap(a);
+ deep_copy();
+}
+
+
#if 0
void MathedArray::insert(MathedArray::iterator pos,
MathedArray::const_iterator beg,
last_ = bf_.size() - 1;
}
#else
-void MathedArray::mergeF(MathedArray * a, int p, int dx)
+void MathedArray::merge(MathedArray const & a, int p)
{
- my_memcpy(&bf_[p], &a->bf_[0], dx);
+ my_memcpy(&bf_[p], &a.bf_[0], a.last());
}
#endif
}
#else
-void MathedArray::raw_pointer_insert(void * p, int pos, int len)
+void MathedArray::raw_pointer_insert(void * p, int pos)
{
- my_memcpy(&bf_[pos], &p, len);
+ my_memcpy(&bf_[pos], &p, sizeof(p));
}
#endif
{
return bf_[i];
}
+
+
+void MathedArray::dump(ostream & os) const
+{
+ buffer_type::const_iterator cit = bf_.begin();
+ buffer_type::const_iterator end = bf_.end();
+ for (; cit != end; ++cit) {
+ os << (*cit);
+ }
+ os << endl;
+}
+
+