OpenShot Audio Library | OpenShotAudio  0.3.1
juce_DynamicObject.cpp
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 DynamicObject::DynamicObject()
27 {
28 }
29 
30 DynamicObject::DynamicObject (const DynamicObject& other)
31  : ReferenceCountedObject(), properties (other.properties)
32 {
33 }
34 
35 DynamicObject::~DynamicObject()
36 {
37 }
38 
39 bool DynamicObject::hasProperty (const Identifier& propertyName) const
40 {
41  const var* const v = properties.getVarPointer (propertyName);
42  return v != nullptr && ! v->isMethod();
43 }
44 
45 const var& DynamicObject::getProperty (const Identifier& propertyName) const
46 {
47  return properties [propertyName];
48 }
49 
50 void DynamicObject::setProperty (const Identifier& propertyName, const var& newValue)
51 {
52  properties.set (propertyName, newValue);
53 }
54 
55 void DynamicObject::removeProperty (const Identifier& propertyName)
56 {
57  properties.remove (propertyName);
58 }
59 
60 bool DynamicObject::hasMethod (const Identifier& methodName) const
61 {
62  return getProperty (methodName).isMethod();
63 }
64 
66 {
67  if (auto function = properties [method].getNativeFunction())
68  return function (args);
69 
70  return {};
71 }
72 
73 void DynamicObject::setMethod (Identifier name, var::NativeFunction function)
74 {
75  properties.set (name, var (function));
76 }
77 
79 {
80  properties.clear();
81 }
82 
84 {
85  for (int i = properties.size(); --i >= 0;)
86  if (auto* v = properties.getVarPointerAt (i))
87  *v = v->clone();
88 }
89 
91 {
92  Ptr d (new DynamicObject (*this));
93  d->cloneAllProperties();
94  return d;
95 }
96 
97 void DynamicObject::writeAsJSON (OutputStream& out, const int indentLevel, const bool allOnOneLine, int maximumDecimalPlaces)
98 {
99  out << '{';
100  if (! allOnOneLine)
101  out << newLine;
102 
103  const int numValues = properties.size();
104 
105  for (int i = 0; i < numValues; ++i)
106  {
107  if (! allOnOneLine)
108  JSONFormatter::writeSpaces (out, indentLevel + JSONFormatter::indentSize);
109 
110  out << '"';
111  JSONFormatter::writeString (out, properties.getName (i));
112  out << "\": ";
113  JSONFormatter::write (out, properties.getValueAt (i), indentLevel + JSONFormatter::indentSize, allOnOneLine, maximumDecimalPlaces);
114 
115  if (i < numValues - 1)
116  {
117  if (allOnOneLine)
118  out << ", ";
119  else
120  out << ',' << newLine;
121  }
122  else if (! allOnOneLine)
123  out << newLine;
124  }
125 
126  if (! allOnOneLine)
127  JSONFormatter::writeSpaces (out, indentLevel);
128 
129  out << '}';
130 }
131 
132 } // namespace juce
virtual void removeProperty(const Identifier &propertyName)
void setMethod(Identifier methodName, var::NativeFunction function)
virtual const var & getProperty(const Identifier &propertyName) const
virtual void setProperty(const Identifier &propertyName, const var &newValue)
virtual bool hasProperty(const Identifier &propertyName) const
virtual void writeAsJSON(OutputStream &, int indentLevel, bool allOnOneLine, int maximumDecimalPlaces)
virtual var invokeMethod(Identifier methodName, const var::NativeFunctionArgs &args)
virtual bool hasMethod(const Identifier &methodName) const