1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-02-06 04:00:08 +00:00
JUCE/src/containers/juce_Variant.h

184 lines
7.3 KiB
C++

/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-10 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.
==============================================================================
*/
#ifndef __JUCE_VARIANT_JUCEHEADER__
#define __JUCE_VARIANT_JUCEHEADER__
#include "juce_Identifier.h"
#include "../io/streams/juce_OutputStream.h"
#include "../io/streams/juce_InputStream.h"
class JUCE_API DynamicObject;
//==============================================================================
/**
A variant class, that can be used to hold a range of primitive values.
A var object can hold a range of simple primitive values, strings, or
a reference-counted pointer to a DynamicObject. The var class is intended
to act like the values used in dynamic scripting languages.
@see DynamicObject
*/
class JUCE_API var
{
public:
//==============================================================================
typedef const var (DynamicObject::*MethodFunction) (const var* arguments, int numArguments);
typedef Identifier identifier;
//==============================================================================
/** Creates a void variant. */
var() throw();
/** Destructor. */
~var() throw();
/** A static var object that can be used where you need an empty variant object. */
static const var null;
var (const var& valueToCopy);
var (int value) throw();
var (bool value) throw();
var (double value) throw();
var (const char* value);
var (const juce_wchar* value);
var (const String& value);
var (DynamicObject* object);
var (MethodFunction method) throw();
var& operator= (const var& valueToCopy);
var& operator= (int value);
var& operator= (bool value);
var& operator= (double value);
var& operator= (const char* value);
var& operator= (const juce_wchar* value);
var& operator= (const String& value);
var& operator= (DynamicObject* object);
var& operator= (MethodFunction method);
void swapWith (var& other) throw();
operator int() const;
operator bool() const;
operator float() const;
operator double() const;
operator const String() const;
const String toString() const;
DynamicObject* getObject() const;
bool isVoid() const throw();
bool isInt() const throw();
bool isBool() const throw();
bool isDouble() const throw();
bool isString() const throw();
bool isObject() const throw();
bool isMethod() const throw();
//==============================================================================
/** Writes a binary representation of this value to a stream.
The data can be read back later using readFromStream().
*/
void writeToStream (OutputStream& output) const;
/** Reads back a stored binary representation of a value.
The data in the stream must have been written using writeToStream(), or this
will have unpredictable results.
*/
static const var readFromStream (InputStream& input);
//==============================================================================
/** If this variant is an object, this returns one of its properties. */
const var operator[] (const Identifier& propertyName) const;
//==============================================================================
/** If this variant is an object, this invokes one of its methods with no arguments. */
const var call (const Identifier& method) const;
/** If this variant is an object, this invokes one of its methods with one argument. */
const var call (const Identifier& method, const var& arg1) const;
/** If this variant is an object, this invokes one of its methods with 2 arguments. */
const var call (const Identifier& method, const var& arg1, const var& arg2) const;
/** If this variant is an object, this invokes one of its methods with 3 arguments. */
const var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3);
/** If this variant is an object, this invokes one of its methods with 4 arguments. */
const var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const;
/** If this variant is an object, this invokes one of its methods with 5 arguments. */
const var call (const Identifier& method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const;
/** If this variant is an object, this invokes one of its methods with a list of arguments. */
const var invoke (const Identifier& method, const var* arguments, int numArguments) const;
//==============================================================================
/** If this variant is a method pointer, this invokes it on a target object. */
const var invoke (const var& targetObject, const var* arguments, int numArguments) const;
//==============================================================================
juce_UseDebuggingNewOperator
/** Returns true if this var has the same value as the one supplied. */
bool equals (const var& other) const throw();
private:
class VariantType;
friend class VariantType;
class VariantType_Void;
friend class VariantType_Void;
class VariantType_Int;
friend class VariantType_Int;
class VariantType_Double;
friend class VariantType_Double;
class VariantType_Float;
friend class VariantType_Float;
class VariantType_Bool;
friend class VariantType_Bool;
class VariantType_String;
friend class VariantType_String;
class VariantType_Object;
friend class VariantType_Object;
class VariantType_Method;
friend class VariantType_Method;
union ValueUnion
{
int intValue;
bool boolValue;
double doubleValue;
String* stringValue;
DynamicObject* objectValue;
MethodFunction methodValue;
};
const VariantType* type;
ValueUnion value;
};
bool operator== (const var& v1, const var& v2) throw();
bool operator!= (const var& v1, const var& v2) throw();
bool operator== (const var& v1, const String& v2) throw();
bool operator!= (const var& v1, const String& v2) throw();
#endif // __JUCE_VARIANT_JUCEHEADER__