26enum VariantStreamMarkers
29 varMarker_BoolTrue = 2,
30 varMarker_BoolFalse = 3,
36 varMarker_Undefined = 9
43 VariantType() noexcept {}
44 virtual ~VariantType() noexcept {}
46 virtual int toInt (
const ValueUnion&)
const noexcept {
return 0; }
47 virtual int64 toInt64 (
const ValueUnion&)
const noexcept {
return 0; }
48 virtual double toDouble (
const ValueUnion&)
const noexcept {
return 0; }
49 virtual String toString (
const ValueUnion&)
const {
return {}; }
50 virtual bool toBool (
const ValueUnion&)
const noexcept {
return false; }
51 virtual ReferenceCountedObject* toObject (
const ValueUnion&)
const noexcept {
return nullptr; }
52 virtual Array<var>* toArray (
const ValueUnion&)
const noexcept {
return nullptr; }
53 virtual MemoryBlock* toBinary (
const ValueUnion&)
const noexcept {
return nullptr; }
54 virtual var clone (
const var& original)
const {
return original; }
56 virtual bool isVoid() const noexcept {
return false; }
57 virtual bool isUndefined() const noexcept {
return false; }
58 virtual bool isInt() const noexcept {
return false; }
59 virtual bool isInt64() const noexcept {
return false; }
60 virtual bool isBool() const noexcept {
return false; }
61 virtual bool isDouble() const noexcept {
return false; }
62 virtual bool isString() const noexcept {
return false; }
63 virtual bool isObject() const noexcept {
return false; }
64 virtual bool isArray() const noexcept {
return false; }
65 virtual bool isBinary() const noexcept {
return false; }
66 virtual bool isMethod() const noexcept {
return false; }
67 virtual bool isComparable() const noexcept {
return false; }
69 virtual void cleanUp (ValueUnion&)
const noexcept {}
70 virtual void createCopy (ValueUnion& dest,
const ValueUnion& source)
const { dest = source; }
71 virtual bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept = 0;
72 virtual void writeToStream (
const ValueUnion& data, OutputStream& output)
const = 0;
76class var::VariantType_Void :
public var::VariantType
79 VariantType_Void() noexcept {}
80 static const VariantType_Void instance;
82 bool isVoid() const noexcept
override {
return true; }
83 bool isComparable() const noexcept
override {
return true; }
84 bool equals (
const ValueUnion&,
const ValueUnion&,
const VariantType& otherType)
const noexcept override {
return otherType.isVoid() || otherType.isUndefined(); }
85 void writeToStream (
const ValueUnion&, OutputStream& output)
const override { output.writeCompressedInt (0); }
89class var::VariantType_Undefined :
public var::VariantType
92 VariantType_Undefined() noexcept {}
93 static const VariantType_Undefined instance;
95 bool isUndefined() const noexcept
override {
return true; }
96 String toString (
const ValueUnion&)
const override {
return "undefined"; }
97 bool equals (
const ValueUnion&,
const ValueUnion&,
const VariantType& otherType)
const noexcept override {
return otherType.isVoid() || otherType.isUndefined(); }
99 void writeToStream (
const ValueUnion&, OutputStream& output)
const override
101 output.writeCompressedInt (1);
102 output.writeByte (varMarker_Undefined);
107class var::VariantType_Int :
public var::VariantType
110 VariantType_Int() noexcept {}
111 static const VariantType_Int instance;
113 int toInt (
const ValueUnion& data)
const noexcept override {
return data.intValue; }
114 int64 toInt64 (
const ValueUnion& data)
const noexcept override {
return (int64) data.intValue; }
115 double toDouble (
const ValueUnion& data)
const noexcept override {
return (
double) data.intValue; }
116 String toString (
const ValueUnion& data)
const override {
return String (data.intValue); }
117 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.intValue != 0; }
118 bool isInt() const noexcept
override {
return true; }
119 bool isComparable() const noexcept
override {
return true; }
121 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
123 if (otherType.isDouble() || otherType.isInt64() || otherType.isString())
124 return otherType.equals (otherData, data, *
this);
126 return otherType.toInt (otherData) == data.intValue;
129 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
131 output.writeCompressedInt (5);
132 output.writeByte (varMarker_Int);
133 output.writeInt (data.intValue);
138class var::VariantType_Int64 :
public var::VariantType
141 VariantType_Int64() noexcept {}
142 static const VariantType_Int64 instance;
144 int toInt (
const ValueUnion& data)
const noexcept override {
return (
int) data.int64Value; }
145 int64 toInt64 (
const ValueUnion& data)
const noexcept override {
return data.int64Value; }
146 double toDouble (
const ValueUnion& data)
const noexcept override {
return (
double) data.int64Value; }
147 String toString (
const ValueUnion& data)
const override {
return String (data.int64Value); }
148 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.int64Value != 0; }
149 bool isInt64() const noexcept
override {
return true; }
150 bool isComparable() const noexcept
override {
return true; }
152 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
154 if (otherType.isDouble() || otherType.isString())
155 return otherType.equals (otherData, data, *
this);
157 return otherType.toInt64 (otherData) == data.int64Value;
160 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
162 output.writeCompressedInt (9);
163 output.writeByte (varMarker_Int64);
164 output.writeInt64 (data.int64Value);
169class var::VariantType_Double :
public var::VariantType
172 VariantType_Double() noexcept {}
173 static const VariantType_Double instance;
175 int toInt (
const ValueUnion& data)
const noexcept override {
return (
int) data.doubleValue; }
176 int64 toInt64 (
const ValueUnion& data)
const noexcept override {
return (int64) data.doubleValue; }
177 double toDouble (
const ValueUnion& data)
const noexcept override {
return data.doubleValue; }
178 String toString (
const ValueUnion& data)
const override {
return serialiseDouble (data.doubleValue); }
179 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.doubleValue != 0.0; }
180 bool isDouble() const noexcept
override {
return true; }
181 bool isComparable() const noexcept
override {
return true; }
183 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
185 return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits<double>::epsilon();
188 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
190 output.writeCompressedInt (9);
191 output.writeByte (varMarker_Double);
192 output.writeDouble (data.doubleValue);
197class var::VariantType_Bool :
public var::VariantType
200 VariantType_Bool() noexcept {}
201 static const VariantType_Bool instance;
203 int toInt (
const ValueUnion& data)
const noexcept override {
return data.boolValue ? 1 : 0; }
204 int64 toInt64 (
const ValueUnion& data)
const noexcept override {
return data.boolValue ? 1 : 0; }
205 double toDouble (
const ValueUnion& data)
const noexcept override {
return data.boolValue ? 1.0 : 0.0; }
206 String toString (
const ValueUnion& data)
const override {
return String::charToString (data.boolValue ? (juce_wchar)
'1' : (juce_wchar)
'0'); }
207 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.boolValue; }
208 bool isBool() const noexcept
override {
return true; }
209 bool isComparable() const noexcept
override {
return true; }
211 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
213 return otherType.toBool (otherData) == data.boolValue;
216 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
218 output.writeCompressedInt (1);
219 output.writeByte (data.boolValue ? (
char) varMarker_BoolTrue : (char) varMarker_BoolFalse);
224class var::VariantType_String :
public var::VariantType
227 VariantType_String() noexcept {}
228 static const VariantType_String instance;
230 void cleanUp (ValueUnion& data)
const noexcept override { getString (data)-> ~String(); }
231 void createCopy (ValueUnion& dest,
const ValueUnion& source)
const override {
new (dest.stringValue) String (*getString (source)); }
233 bool isString() const noexcept
override {
return true; }
234 int toInt (
const ValueUnion& data)
const noexcept override {
return getString (data)->getIntValue(); }
235 int64 toInt64 (
const ValueUnion& data)
const noexcept override {
return getString (data)->getLargeIntValue(); }
236 double toDouble (
const ValueUnion& data)
const noexcept override {
return getString (data)->getDoubleValue(); }
237 String toString (
const ValueUnion& data)
const override {
return *getString (data); }
238 bool toBool (
const ValueUnion& data)
const noexcept override {
return getString (data)->getIntValue() != 0
239 || getString (data)->trim().equalsIgnoreCase (
"true")
240 || getString (data)->trim().equalsIgnoreCase (
"yes"); }
241 bool isComparable() const noexcept
override {
return true; }
243 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
245 return otherType.toString (otherData) == *getString (data);
248 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
250 auto* s = getString (data);
251 const size_t len = s->getNumBytesAsUTF8() + 1;
252 HeapBlock<char> temp (len);
253 s->copyToUTF8 (temp, len);
254 output.writeCompressedInt ((
int) (len + 1));
255 output.writeByte (varMarker_String);
256 output.write (temp, len);
260 static inline const String* getString (
const ValueUnion& data)
noexcept {
return reinterpret_cast<const String*
> (data.stringValue); }
261 static inline String* getString (ValueUnion& data)
noexcept {
return reinterpret_cast<String*
> (data.stringValue); }
265class var::VariantType_Object :
public var::VariantType
268 VariantType_Object() noexcept {}
269 static const VariantType_Object instance;
271 void cleanUp (ValueUnion& data)
const noexcept override {
if (data.objectValue !=
nullptr) data.objectValue->decReferenceCount(); }
273 void createCopy (ValueUnion& dest,
const ValueUnion& source)
const override
275 dest.objectValue = source.objectValue;
276 if (dest.objectValue !=
nullptr)
277 dest.objectValue->incReferenceCount();
280 String toString (
const ValueUnion& data)
const override {
return "Object 0x" +
String::toHexString ((
int) (pointer_sized_int) data.objectValue); }
281 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.objectValue !=
nullptr; }
282 ReferenceCountedObject* toObject (
const ValueUnion& data)
const noexcept override {
return data.objectValue; }
283 bool isObject() const noexcept
override {
return true; }
285 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
287 return otherType.toObject (otherData) == data.objectValue;
292 if (
auto* d = original.getDynamicObject())
293 return d->
clone().get();
299 void writeToStream (
const ValueUnion&, OutputStream& output)
const override
302 output.writeCompressedInt (0);
307class var::VariantType_Array :
public var::VariantType_Object
310 VariantType_Array() noexcept {}
311 static const VariantType_Array instance;
313 String toString (
const ValueUnion&)
const override {
return "[Array]"; }
314 ReferenceCountedObject* toObject (
const ValueUnion&)
const noexcept override {
return nullptr; }
315 bool isArray() const noexcept
override {
return true; }
317 Array<var>* toArray (
const ValueUnion& data)
const noexcept override
319 if (
auto* a =
dynamic_cast<RefCountedArray*
> (data.objectValue))
325 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
327 auto* thisArray = toArray (data);
328 auto* otherArray = otherType.toArray (otherData);
329 return thisArray == otherArray || (thisArray !=
nullptr && otherArray !=
nullptr && *otherArray == *thisArray);
334 Array<var> arrayCopy;
336 if (
auto* array = toArray (original.value))
338 arrayCopy.ensureStorageAllocated (array->size());
340 for (
auto& i : *array)
341 arrayCopy.add (i.
clone());
344 return var (arrayCopy);
347 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
349 if (
auto* array = toArray (data))
351 MemoryOutputStream buffer (512);
352 buffer.writeCompressedInt (array->size());
354 for (
auto& i : *array)
355 i.writeToStream (buffer);
357 output.writeCompressedInt (1 + (
int) buffer.getDataSize());
358 output.writeByte (varMarker_Array);
363 struct RefCountedArray :
public ReferenceCountedObject
366 RefCountedArray (Array<var>&& a) : array (std::move (a)) {
incReferenceCount(); }
372class var::VariantType_Binary :
public var::VariantType
375 VariantType_Binary() noexcept {}
377 static const VariantType_Binary instance;
379 void cleanUp (ValueUnion& data)
const noexcept override {
delete data.binaryValue; }
380 void createCopy (ValueUnion& dest,
const ValueUnion& source)
const override { dest.binaryValue =
new MemoryBlock (*source.binaryValue); }
382 String toString (
const ValueUnion& data)
const override {
return data.binaryValue->toBase64Encoding(); }
383 bool isBinary() const noexcept
override {
return true; }
384 MemoryBlock* toBinary (
const ValueUnion& data)
const noexcept override {
return data.binaryValue; }
386 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
388 const MemoryBlock*
const otherBlock = otherType.toBinary (otherData);
389 return otherBlock !=
nullptr && *otherBlock == *data.binaryValue;
392 void writeToStream (
const ValueUnion& data, OutputStream& output)
const override
394 output.writeCompressedInt (1 + (
int) data.binaryValue->getSize());
395 output.writeByte (varMarker_Binary);
396 output << *data.binaryValue;
401class var::VariantType_Method :
public var::VariantType
404 VariantType_Method() noexcept {}
405 static const VariantType_Method instance;
407 void cleanUp (ValueUnion& data)
const noexcept override {
if (data.methodValue !=
nullptr )
delete data.methodValue; }
408 void createCopy (ValueUnion& dest,
const ValueUnion& source)
const override { dest.methodValue =
new NativeFunction (*source.methodValue); }
410 String toString (
const ValueUnion&)
const override {
return "Method"; }
411 bool toBool (
const ValueUnion& data)
const noexcept override {
return data.methodValue !=
nullptr; }
412 bool isMethod() const noexcept
override {
return true; }
414 bool equals (
const ValueUnion& data,
const ValueUnion& otherData,
const VariantType& otherType)
const noexcept override
416 return otherType.isMethod() && otherData.methodValue == data.methodValue;
419 void writeToStream (
const ValueUnion&, OutputStream& output)
const override
422 output.writeCompressedInt (0);
427const var::VariantType_Void var::VariantType_Void::instance;
428const var::VariantType_Undefined var::VariantType_Undefined::instance;
429const var::VariantType_Int var::VariantType_Int::instance;
430const var::VariantType_Int64 var::VariantType_Int64::instance;
431const var::VariantType_Bool var::VariantType_Bool::instance;
432const var::VariantType_Double var::VariantType_Double::instance;
433const var::VariantType_String var::VariantType_String::instance;
434const var::VariantType_Object var::VariantType_Object::instance;
435const var::VariantType_Array var::VariantType_Array::instance;
436const var::VariantType_Binary var::VariantType_Binary::instance;
437const var::VariantType_Method var::VariantType_Method::instance;
445JUCE_DECLARE_DEPRECATED_STATIC (
const var var::null;)
453var::var (
const int v) noexcept : type (&VariantType_Int::instance) { value.intValue = v; }
454var::var (
const int64 v) noexcept : type (&VariantType_Int64::instance) { value.int64Value = v; }
455var::var (
const bool v) noexcept : type (&VariantType_Bool::instance) { value.boolValue = v; }
456var::var (
const double v) noexcept : type (&VariantType_Double::instance) { value.doubleValue = v; }
457var::var (NativeFunction m) noexcept : type (&VariantType_Method::instance) { value.methodValue =
new NativeFunction (m); }
458var::var (
const Array<var>& v) : type (&VariantType_Array::instance) { value.objectValue =
new VariantType_Array::RefCountedArray(v); }
459var::var (
const String& v) : type (&VariantType_String::instance) {
new (value.stringValue) String (v); }
460var::var (
const char*
const v) : type (&VariantType_String::instance) {
new (value.stringValue) String (v); }
461var::var (
const wchar_t*
const v) : type (&VariantType_String::instance) {
new (value.stringValue) String (v); }
462var::var (
const void* v,
size_t sz) : type (&VariantType_Binary::instance) { value.binaryValue =
new MemoryBlock (v, sz); }
463var::var (
const MemoryBlock& v) : type (&VariantType_Binary::instance) { value.binaryValue =
new MemoryBlock (v); }
465var::var (
const StringArray& v) : type (&VariantType_Array::instance)
468 strings.ensureStorageAllocated (v.size());
471 strings.add (
var (i));
473 value.objectValue =
new VariantType_Array::RefCountedArray (strings);
476var::var (ReferenceCountedObject*
const object) : type (&VariantType_Object::instance)
478 value.objectValue = object;
480 if (
object !=
nullptr)
481 object->incReferenceCount();
488bool var::isUndefined() const noexcept {
return type->isUndefined(); }
489bool var::isInt() const noexcept {
return type->isInt(); }
490bool var::isInt64() const noexcept {
return type->isInt64(); }
491bool var::isBool() const noexcept {
return type->isBool(); }
492bool var::isDouble() const noexcept {
return type->isDouble(); }
493bool var::isString() const noexcept {
return type->isString(); }
494bool var::isObject() const noexcept {
return type->isObject(); }
495bool var::isArray() const noexcept {
return type->isArray(); }
496bool var::isBinaryData() const noexcept {
return type->isBinary(); }
497bool var::isMethod() const noexcept {
return type->isMethod(); }
499var::operator int() const noexcept {
return type->toInt (value); }
500var::operator int64() const noexcept {
return type->toInt64 (value); }
501var::operator bool() const noexcept {
return type->toBool (value); }
502var::operator float() const noexcept {
return (
float) type->toDouble (value); }
503var::operator double() const noexcept {
return type->toDouble (value); }
504String var::toString()
const {
return type->toString (value); }
505var::operator String()
const {
return type->toString (value); }
506ReferenceCountedObject* var::getObject() const noexcept {
return type->toObject (value); }
512void var::swapWith (var& other)
noexcept
514 std::swap (type, other.type);
515 std::swap (value, other.value);
518var& var::operator= (
const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value);
return *
this; }
519var& var::operator= (
const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v;
return *
this; }
520var& var::operator= (
const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v;
return *
this; }
521var& var::operator= (
const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v;
return *
this; }
522var& var::operator= (
const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v;
return *
this; }
523var& var::operator= (
const char*
const v) { type->cleanUp (value); type = &VariantType_String::instance;
new (value.stringValue) String (v);
return *
this; }
524var& var::operator= (
const wchar_t*
const v) { type->cleanUp (value); type = &VariantType_String::instance;
new (value.stringValue) String (v);
return *
this; }
525var& var::operator= (
const String& v) { type->cleanUp (value); type = &VariantType_String::instance;
new (value.stringValue) String (v);
return *
this; }
526var& var::operator= (
const MemoryBlock& v) { type->cleanUp (value); type = &VariantType_Binary::instance; value.binaryValue =
new MemoryBlock (v);
return *
this; }
527var& var::operator= (
const Array<var>& v) {
var v2 (v); swapWith (v2);
return *
this; }
528var& var::operator= (ReferenceCountedObject* v) {
var v2 (v); swapWith (v2);
return *
this; }
529var& var::operator= (NativeFunction v) {
var v2 (v); swapWith (v2);
return *
this; }
535 other.type = &VariantType_Void::instance;
538var& var::operator= (var&& other)
noexcept
544var::var (String&& v) : type (&VariantType_String::instance)
546 new (value.stringValue) String (std::move (v));
549var::var (MemoryBlock&& v) : type (&VariantType_Binary::instance)
551 value.binaryValue =
new MemoryBlock (std::move (v));
554var::var (Array<var>&& v) : type (&VariantType_Array::instance)
556 value.objectValue =
new VariantType_Array::RefCountedArray (std::move (v));
559var& var::operator= (String&& v)
561 type->cleanUp (value);
562 type = &VariantType_String::instance;
563 new (value.stringValue) String (std::move (v));
570 return type->equals (value,
other.value, *
other.type);
575 return hasSameTypeAs (
other) && equals (
other);
580 return type ==
other.type;
583bool canCompare (
const var& v1,
const var& v2)
585 return v1.type->isComparable() && v2.type->isComparable();
588static int compare (
const var& v1,
const var& v2)
590 if (v1.isString() && v2.isString())
591 return v1.toString().compare (v2.toString());
593 auto diff =
static_cast<double> (v1) -
static_cast<double> (v2);
594 return diff == 0 ? 0 : (diff < 0 ? -1 : 1);
597bool operator== (
const var& v1,
const var& v2) {
return v1.equals (v2); }
598bool operator!= (
const var& v1,
const var& v2) {
return ! v1.equals (v2); }
599bool operator< (
const var& v1,
const var& v2) {
return canCompare (v1, v2) && compare (v1, v2) < 0; }
600bool operator> (
const var& v1,
const var& v2) {
return canCompare (v1, v2) && compare (v1, v2) > 0; }
601bool operator<= (
const var& v1,
const var& v2) {
return canCompare (v1, v2) && compare (v1, v2) <= 0; }
602bool operator>= (
const var& v1,
const var& v2) {
return canCompare (v1, v2) && compare (v1, v2) >= 0; }
604bool operator== (
const var& v1,
const String& v2) {
return v1.toString() == v2; }
605bool operator!= (
const var& v1,
const String& v2) {
return v1.toString() != v2; }
606bool operator== (
const var& v1,
const char* v2) {
return v1.toString() == v2; }
607bool operator!= (
const var& v1,
const char* v2) {
return v1.toString() != v2; }
612 return type->clone (*
this);
618 if (
auto*
o = getDynamicObject())
621 return getNullVarRef();
631 if (
auto*
o = getDynamicObject())
639 if (
auto*
o = getDynamicObject())
647 return isMethod() && (value.methodValue !=
nullptr) ? *value.methodValue :
nullptr;
652 if (
auto*
o = getDynamicObject())
696 return array->
size();
707 jassert (array !=
nullptr && isPositiveAndBelow (
arrayIndex, array->
size()));
718 jassert (array !=
nullptr && isPositiveAndBelow (
arrayIndex, array->
size()));
739 convertToArray()->
add (n);
750 convertToArray()->
insert (index, n);
769 type->writeToStream (value, output);
780 case varMarker_Int:
return var (input.
readInt());
782 case varMarker_BoolTrue:
return var (
true);
783 case varMarker_BoolFalse:
return var (
false);
786 case varMarker_String:
789 mo.writeFromInputStream (input, numBytes - 1);
790 return var (
mo.toUTF8());
793 case varMarker_Binary:
806 case varMarker_Array:
826 : thisObject (
t), arguments (
args), numArguments (
numArgs)
int size() const noexcept
void remove(int indexToRemove)
void insert(int indexToInsertAt, ParameterType newElement)
int indexOf(ParameterType elementToLookFor) const
void add(const ElementType &newElement)
void resize(int targetNumItems)
void incReferenceCount() noexcept
static String toHexString(IntegerType number)
static String charToString(juce_wchar character)
static var undefined() noexcept
void insert(int index, const var &value)
var invoke(const Identifier &method, const var *arguments, int numArguments) const
void writeToStream(OutputStream &output) const
Array< var > * getArray() const noexcept
int indexOf(const var &value) const
const var & operator[](int arrayIndex) const
NativeFunction getNativeFunction() const
bool hasProperty(const Identifier &propertyName) const noexcept
static var readFromStream(InputStream &input)
void append(const var &valueToAppend)
bool equals(const var &other) const noexcept
bool equalsWithSameType(const var &other) const noexcept
void resize(int numArrayElementsWanted)
var getProperty(const Identifier &propertyName, const var &defaultReturnValue) const
var call(const Identifier &method) const
bool hasSameTypeAs(const var &other) const noexcept
var clone() const noexcept
MemoryBlock * getBinaryData() const noexcept