| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library - "Jules' Utility Class Extensions"
 -    Copyright 2004-11 by Raw Material Software Ltd.
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    JUCE can be redistributed and/or modified under the terms of the GNU General
 -    Public License (Version 2), as published by the Free Software Foundation.
 -    A copy of the license is included in the JUCE distribution, or can be found
 -    online at www.gnu.org/licenses.
 - 
 -    JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
 -    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
 -    A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
 - 
 -   ------------------------------------------------------------------------------
 - 
 -    To release a closed-source product which uses JUCE, commercial licenses are
 -    available: visit www.rawmaterialsoftware.com/juce for more information.
 - 
 -   ==============================================================================
 - */
 - 
 - Value::ValueSource::ValueSource()
 - {
 - }
 - 
 - Value::ValueSource::~ValueSource()
 - {
 - }
 - 
 - void Value::ValueSource::sendChangeMessage (const bool synchronous)
 - {
 -     if (synchronous)
 -     {
 -         // (hold a local reference to this object in case it's freed during the callbacks)
 -         const ReferenceCountedObjectPtr<ValueSource> localRef (this);
 - 
 -         for (int i = valuesWithListeners.size(); --i >= 0;)
 -         {
 -             Value* const v = valuesWithListeners[i];
 - 
 -             if (v != nullptr)
 -                 v->callListeners();
 -         }
 -     }
 -     else
 -     {
 -         if (valuesWithListeners.size() > 0)
 -             triggerAsyncUpdate();
 -     }
 - }
 - 
 - void Value::ValueSource::handleAsyncUpdate()
 - {
 -     sendChangeMessage (true);
 - }
 - 
 - //==============================================================================
 - class SimpleValueSource  : public Value::ValueSource
 - {
 - public:
 -     SimpleValueSource()
 -     {
 -     }
 - 
 -     SimpleValueSource (const var& initialValue)
 -         : value (initialValue)
 -     {
 -     }
 - 
 -     var getValue() const
 -     {
 -         return value;
 -     }
 - 
 -     void setValue (const var& newValue)
 -     {
 -         if (! newValue.equalsWithSameType (value))
 -         {
 -             value = newValue;
 -             sendChangeMessage (false);
 -         }
 -     }
 - 
 - private:
 -     var value;
 - 
 -     JUCE_DECLARE_NON_COPYABLE (SimpleValueSource);
 - };
 - 
 - 
 - //==============================================================================
 - Value::Value()
 -     : value (new SimpleValueSource())
 - {
 - }
 - 
 - Value::Value (ValueSource* const value_)
 -     : value (value_)
 - {
 -     jassert (value_ != nullptr);
 - }
 - 
 - Value::Value (const var& initialValue)
 -     : value (new SimpleValueSource (initialValue))
 - {
 - }
 - 
 - Value::Value (const Value& other)
 -     : value (other.value)
 - {
 - }
 - 
 - Value& Value::operator= (const Value& other)
 - {
 -     value = other.value;
 -     return *this;
 - }
 - 
 - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
 - Value::Value (Value&& other) noexcept
 -     : value (static_cast <ReferenceCountedObjectPtr <ValueSource>&&> (other.value))
 - {
 - }
 - 
 - Value& Value::operator= (Value&& other) noexcept
 - {
 -     value = static_cast <ReferenceCountedObjectPtr <ValueSource>&&> (other.value);
 -     return *this;
 - }
 - #endif
 - 
 - Value::~Value()
 - {
 -     if (listeners.size() > 0)
 -         value->valuesWithListeners.removeValue (this);
 - }
 - 
 - //==============================================================================
 - var Value::getValue() const
 - {
 -     return value->getValue();
 - }
 - 
 - Value::operator var() const
 - {
 -     return value->getValue();
 - }
 - 
 - void Value::setValue (const var& newValue)
 - {
 -     value->setValue (newValue);
 - }
 - 
 - String Value::toString() const
 - {
 -     return value->getValue().toString();
 - }
 - 
 - Value& Value::operator= (const var& newValue)
 - {
 -     value->setValue (newValue);
 -     return *this;
 - }
 - 
 - void Value::referTo (const Value& valueToReferTo)
 - {
 -     if (valueToReferTo.value != value)
 -     {
 -         if (listeners.size() > 0)
 -         {
 -             value->valuesWithListeners.removeValue (this);
 -             valueToReferTo.value->valuesWithListeners.add (this);
 -         }
 - 
 -         value = valueToReferTo.value;
 -         callListeners();
 -     }
 - }
 - 
 - bool Value::refersToSameSourceAs (const Value& other) const
 - {
 -     return value == other.value;
 - }
 - 
 - bool Value::operator== (const Value& other) const
 - {
 -     return value == other.value || value->getValue() == other.getValue();
 - }
 - 
 - bool Value::operator!= (const Value& other) const
 - {
 -     return value != other.value && value->getValue() != other.getValue();
 - }
 - 
 - //==============================================================================
 - void Value::addListener (ValueListener* const listener)
 - {
 -     if (listener != nullptr)
 -     {
 -         if (listeners.size() == 0)
 -             value->valuesWithListeners.add (this);
 - 
 -         listeners.add (listener);
 -     }
 - }
 - 
 - void Value::removeListener (ValueListener* const listener)
 - {
 -     listeners.remove (listener);
 - 
 -     if (listeners.size() == 0)
 -         value->valuesWithListeners.removeValue (this);
 - }
 - 
 - void Value::callListeners()
 - {
 -     Value v (*this); // (create a copy in case this gets deleted by a callback)
 -     listeners.call (&ValueListener::valueChanged, v);
 - }
 - 
 - OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const Value& value)
 - {
 -     return stream << value.toString();
 - }
 
 
  |