OpenShot Audio Library | OpenShotAudio  0.3.1
juce_Variant.h
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2017 - ROLI Ltd.
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
26 //==============================================================================
41 class JUCE_API var
42 {
43 public:
44  //==============================================================================
48  struct JUCE_API NativeFunctionArgs
49  {
50  NativeFunctionArgs (const var& thisObject, const var* args, int numArgs) noexcept;
51 
52  const var& thisObject;
53  const var* arguments;
54  int numArguments;
55  };
56 
57  using NativeFunction = std::function<var(const NativeFunctionArgs&)>;
58 
59  //==============================================================================
61  var() noexcept;
62 
64  ~var() noexcept;
65 
66  var (const var& valueToCopy);
67  var (int value) noexcept;
68  var (int64 value) noexcept;
69  var (bool value) noexcept;
70  var (double value) noexcept;
71  var (const char* value);
72  var (const wchar_t* value);
73  var (const String& value);
74  var (const Array<var>& value);
75  var (const StringArray& value);
76  var (ReferenceCountedObject* object);
77  var (NativeFunction method) noexcept;
78  var (const void* binaryData, size_t dataSize);
79  var (const MemoryBlock& binaryData);
80 
81  var& operator= (const var& valueToCopy);
82  var& operator= (int value);
83  var& operator= (int64 value);
84  var& operator= (bool value);
85  var& operator= (double value);
86  var& operator= (const char* value);
87  var& operator= (const wchar_t* value);
88  var& operator= (const String& value);
89  var& operator= (const MemoryBlock& value);
90  var& operator= (const Array<var>& value);
91  var& operator= (ReferenceCountedObject* object);
92  var& operator= (NativeFunction method);
93 
94  var (var&&) noexcept;
95  var (String&&);
96  var (MemoryBlock&&);
97  var (Array<var>&&);
98  var& operator= (var&&) noexcept;
99  var& operator= (String&&);
100 
101  void swapWith (var& other) noexcept;
102 
104  static var undefined() noexcept;
105 
106  //==============================================================================
107  operator int() const noexcept;
108  operator int64() const noexcept;
109  operator bool() const noexcept;
110  operator float() const noexcept;
111  operator double() const noexcept;
112  operator String() const;
113  String toString() const;
114 
121  Array<var>* getArray() const noexcept;
122 
129  MemoryBlock* getBinaryData() const noexcept;
130 
131  ReferenceCountedObject* getObject() const noexcept;
132  DynamicObject* getDynamicObject() const noexcept;
133 
134  //==============================================================================
135  bool isVoid() const noexcept;
136  bool isUndefined() const noexcept;
137  bool isInt() const noexcept;
138  bool isInt64() const noexcept;
139  bool isBool() const noexcept;
140  bool isDouble() const noexcept;
141  bool isString() const noexcept;
142  bool isObject() const noexcept;
143  bool isArray() const noexcept;
144  bool isBinaryData() const noexcept;
145  bool isMethod() const noexcept;
146 
152  bool equals (const var& other) const noexcept;
153 
158  bool equalsWithSameType (const var& other) const noexcept;
159 
161  bool hasSameTypeAs (const var& other) const noexcept;
162 
167  var clone() const noexcept;
168 
169  //==============================================================================
173  int size() const;
174 
182  const var& operator[] (int arrayIndex) const;
183 
191  var& operator[] (int arrayIndex);
192 
200  void append (const var& valueToAppend);
201 
209  void insert (int index, const var& value);
210 
216  void remove (int index);
217 
224  void resize (int numArrayElementsWanted);
225 
230  int indexOf (const var& value) const;
231 
232  //==============================================================================
234  const var& operator[] (const Identifier& propertyName) const;
236  const var& operator[] (const char* propertyName) const;
239  var getProperty (const Identifier& propertyName, const var& defaultReturnValue) const;
241  bool hasProperty (const Identifier& propertyName) const noexcept;
242 
244  var call (const Identifier& method) const;
246  var call (const Identifier& method, const var& arg1) const;
248  var call (const Identifier& method, const var& arg1, const var& arg2) const;
250  var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3);
252  var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const;
254  var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const;
256  var invoke (const Identifier& method, const var* arguments, int numArguments) const;
258  NativeFunction getNativeFunction() const;
259 
260  //==============================================================================
265  void writeToStream (OutputStream& output) const;
266 
272  static var readFromStream (InputStream& input);
273 
274  /* This was a static empty var object, but is now deprecated as it's too easy to accidentally
275  use it indirectly during a static constructor, leading to hard-to-find order-of-initialisation
276  problems.
277  @deprecated If you need a default-constructed var, just use var() or {}.
278  The only time you might miss having var::null available might be if you need to return an
279  empty var from a function by reference, but if you need to do that, it's easy enough to use
280  a function-local static var and return that, avoiding any order-of-initialisation issues.
281  */
282  JUCE_DEPRECATED_STATIC (static const var null;)
283 
284 private:
285  //==============================================================================
286  class VariantType;
287  class VariantType_Void;
288  class VariantType_Undefined;
289  class VariantType_Int;
290  class VariantType_Int64;
291  class VariantType_Double;
292  class VariantType_Bool;
293  class VariantType_String;
294  class VariantType_Object;
295  class VariantType_Array;
296  class VariantType_Binary;
297  class VariantType_Method;
298 
299  union ValueUnion
300  {
301  int intValue;
302  int64 int64Value;
303  bool boolValue;
304  double doubleValue;
305  char stringValue[sizeof (String)];
306  ReferenceCountedObject* objectValue;
307  MemoryBlock* binaryValue;
308  NativeFunction* methodValue;
309  };
310 
311  friend bool canCompare (const var&, const var&);
312 
313  const VariantType* type;
314  ValueUnion value;
315 
316  Array<var>* convertToArray();
317  var (const VariantType&) noexcept;
318 
319  // This is needed to prevent the wrong constructor/operator being called
320  var (const ReferenceCountedObject*) = delete;
321  var& operator= (const ReferenceCountedObject*) = delete;
322  var (const void*) = delete;
323  var& operator= (const void*) = delete;
324 };
325 
327 JUCE_API bool operator== (const var&, const var&);
329 JUCE_API bool operator!= (const var&, const var&);
331 JUCE_API bool operator< (const var&, const var&);
333 JUCE_API bool operator<= (const var&, const var&);
335 JUCE_API bool operator> (const var&, const var&);
337 JUCE_API bool operator>= (const var&, const var&);
338 
339 JUCE_API bool operator== (const var&, const String&);
340 JUCE_API bool operator!= (const var&, const String&);
341 JUCE_API bool operator== (const var&, const char*);
342 JUCE_API bool operator!= (const var&, const char*);
343 
344 //==============================================================================
349 template <typename Type>
351 {
352  static Type fromVar (const var& v) { return static_cast<Type> (v); }
353  static var toVar (const Type& t) { return t; }
354 };
355 
356 #ifndef DOXYGEN
357 template <>
358 struct VariantConverter<String>
359 {
360  static String fromVar (const var& v) { return v.toString(); }
361  static var toVar (const String& s) { return s; }
362 };
363 #endif
364 
365 } // namespace juce