ultimatepp/uppsrc/Esc/EscArray.cpp
cxl 9293ed2be0 uppsrc: Visual C++ compiler bug [W]StringBuffer workaround
git-svn-id: svn://ultimatepp.org/upp/trunk@15123 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-09-23 09:37:31 +00:00

168 lines
2.7 KiB
C++

#include "Esc.h"
namespace Upp {
#define LTIMING(x) // RTIMING(x)
Vector<EscValue>& EscValue::CloneArray()
{
LTIMING("CloneArray");
ASSERT(IsArray());
if(array->refcount != 1) {
EscArray *c = new EscArray;
c->array <<= array->array;
array->Release();
array = c;
}
hash = 0;
return array->array;
}
const Vector<EscValue>& EscValue::GetArray() const
{
ASSERT(IsArray());
return array->array;
}
EscValue EscValue::ArrayGet(int i) const
{
return GetArray()[i];
}
EscValue EscValue::ArrayGet(int i, int n) const
{
LTIMING("ArrayGet");
const Vector<EscValue>& sa = GetArray();
ASSERT(i >= 0 && i + n <= sa.GetCount());
EscValue t;
t.SetEmptyArray();
t.array->array.Append(sa, i, n);
return t;
}
void EscValue::SetEmptyArray()
{
Free();
type = ESC_ARRAY;
hash = 0;
array = new EscArray;
}
bool EscValue::ArraySet(int i, EscValue val)
{
LTIMING("ArraySet");
Vector<EscValue>& ta = CloneArray();
if(i > max_total || i - ta.GetCount() + total > max_total)
return false;
CloneArray().At(i) = val;
return true;
}
void EscValue::ArrayAdd(EscValue val)
{
LTIMING("ArrayAdd");
if(IsVoid())
SetEmptyArray();
CloneArray().Add(val);
}
bool EscValue::Replace(int i, int n, EscValue a)
{
LTIMING("Array Replace");
ASSERT(i >= 0);
Vector<EscValue>& ta = CloneArray();
if(i > max_total || i + n > max_total || i + n - ta.GetCount() + total > max_total)
return false;
if(i > 0)
ta.At(i - 1);
const Vector<EscValue>& sa = a.GetArray();
int q = sa.GetCount() - n;
if(q > 0)
ta.InsertN(i, q);
else
ta.Remove(i, -q);
for(q = 0; q < sa.GetCount(); q++)
ta[q + i] = sa[q];
return true;
}
bool EscValue::Append(EscValue a)
{
if(IsVoid())
SetEmptyArray();
return Replace(GetCount(), 0, a);
}
EscValue::operator WString() const
{
LTIMING("operator String");
WStringBuffer s;
if(IsArray()) {
const Vector<EscValue>& a = GetArray();
for(int i = 0; i < a.GetCount(); i++)
if(a[i].IsInt()) {
int c = a[i].GetInt();
if(c >= 0 && c < 65536)
s.Cat(c);
}
}
return WString(s);
}
void EscValue::InitString(const WString& s)
{
type = ESC_ARRAY;
array = new EscArray();
hash = 0;
Vector<EscValue>& a = array->array;
a.SetCount(s.GetCount());
for(int i = 0; i < s.GetCount(); i++)
a[i] = (int64)s[i];
total++;
}
int EscValue::GetTotalCount()
{
return total;
}
void EscValue::SetMaxTotalCount(int n)
{
max_total = n;
}
int EscValue::GetMaxTotalCount()
{
return max_total;
}
EscValue::EscValue()
{
type = ESC_VOID; hash = 0; total++;
}
EscValue::EscValue(double n)
{
number = n;
type = ESC_DOUBLE;
hash = 0;
total++;
}
EscValue::EscValue(int64 n)
{
i64 = n;
type = ESC_INT64;
hash = 0;
total++;
}
EscValue::EscValue(int n)
{
i64 = n;
type = ESC_INT64;
hash = 0;
total++;
}
}