summaryrefslogtreecommitdiff
path: root/cpp/src/FreezeScript/Data.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/FreezeScript/Data.h')
-rw-r--r--cpp/src/FreezeScript/Data.h639
1 files changed, 639 insertions, 0 deletions
diff --git a/cpp/src/FreezeScript/Data.h b/cpp/src/FreezeScript/Data.h
new file mode 100644
index 00000000000..4d0883f951f
--- /dev/null
+++ b/cpp/src/FreezeScript/Data.h
@@ -0,0 +1,639 @@
+// **********************************************************************
+//
+// Copyright (c) 2004
+// ZeroC, Inc.
+// Billerica, MA, USA
+//
+// All Rights Reserved.
+//
+// Ice is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License version 2 as published by
+// the Free Software Foundation.
+//
+// **********************************************************************
+
+#ifndef FREEZE_SCRIPT_DATA_H
+#define FREEZE_SCRIPT_DATA_H
+
+#include <Ice/Ice.h>
+#include <Slice/Parser.h>
+#include <FreezeScript/Error.h>
+
+namespace FreezeScript
+{
+
+class DataFactory;
+typedef IceUtil::Handle<DataFactory> DataFactoryPtr;
+
+class Data;
+typedef IceUtil::Handle<Data> DataPtr;
+
+class DataVisitor;
+
+typedef std::map<std::string, DataPtr> DataMemberMap;
+typedef std::vector<DataPtr> DataList;
+typedef std::map<DataPtr, DataPtr> DataMap;
+
+class ObjectWriter;
+class ObjectReader;
+
+class ObjectData;
+typedef IceUtil::Handle<ObjectData> ObjectDataPtr;
+
+class DataInitializer : virtual public IceUtil::SimpleShared
+{
+public:
+
+ virtual ~DataInitializer();
+
+ virtual void initialize(const DataFactoryPtr&, const DataPtr&, const Ice::CommunicatorPtr&) = 0;
+};
+typedef IceUtil::Handle<DataInitializer> DataInitializerPtr;
+
+class DataFactory : public IceUtil::SimpleShared
+{
+public:
+
+ DataFactory(const Ice::CommunicatorPtr&, const Slice::UnitPtr&, const ErrorReporterPtr&);
+
+ DataPtr create(const Slice::TypePtr&, bool);
+ DataPtr createBoolean(bool, bool);
+ DataPtr createInteger(Ice::Long, bool);
+ DataPtr createDouble(double, bool);
+ DataPtr createString(const std::string&, bool);
+ DataPtr createNil(bool);
+ DataPtr createObject(const Slice::TypePtr&, bool);
+
+ Slice::BuiltinPtr getBuiltin(Slice::Builtin::Kind) const;
+
+ void addInitializer(const std::string&, const DataInitializerPtr&);
+ void enableInitializers();
+ void disableInitializers();
+
+ Ice::CommunicatorPtr getCommunicator() const;
+ ErrorReporterPtr getErrorReporter() const;
+
+private:
+
+ DataPtr createImpl(const Slice::TypePtr&, bool);
+ void initialize(const DataPtr&);
+
+ Ice::CommunicatorPtr _communicator;
+ Slice::UnitPtr _unit; // Only used for creating builtin types.
+ ErrorReporterPtr _errorReporter;
+ typedef std::map<std::string, DataInitializerPtr> InitMap;
+ InitMap _initializers;
+ bool _initializersEnabled;
+};
+
+class Data : public IceUtil::SimpleShared
+{
+public:
+
+ virtual ~Data();
+
+ virtual DataPtr getMember(const std::string&) const = 0;
+ virtual DataPtr getElement(const DataPtr&) const = 0;
+
+ virtual bool operator==(const Data&) const = 0;
+ virtual bool operator!=(const Data&) const = 0;
+ virtual bool operator<(const Data&) const = 0;
+
+ virtual DataPtr clone() const = 0;
+
+ bool readOnly() const;
+ virtual Slice::TypePtr getType() const = 0;
+ virtual void destroy() = 0;
+
+ virtual void marshal(IceInternal::BasicStream&) const = 0;
+ virtual void unmarshal(IceInternal::BasicStream&) = 0;
+
+ virtual bool booleanValue(bool = false) const = 0;
+ virtual Ice::Long integerValue(bool = false) const = 0;
+ virtual double doubleValue(bool = false) const = 0;
+ virtual std::string stringValue(bool = false) const = 0;
+ virtual std::string toString() const = 0;
+
+ virtual void visit(DataVisitor&) = 0;
+
+protected:
+
+ Data(const ErrorReporterPtr&, bool);
+
+ ErrorReporterPtr _errorReporter;
+ bool _readOnly;
+};
+
+class PrimitiveData : public Data
+{
+public:
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual void destroy();
+
+protected:
+
+ PrimitiveData(const ErrorReporterPtr&, bool);
+};
+typedef IceUtil::Handle<PrimitiveData> PrimitiveDataPtr;
+
+class BooleanData : public PrimitiveData
+{
+public:
+
+ BooleanData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool);
+ BooleanData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool, bool);
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ bool getValue() const;
+ void setValue(bool);
+
+private:
+
+ Slice::BuiltinPtr _type;
+ bool _value;
+};
+typedef IceUtil::Handle<BooleanData> BooleanDataPtr;
+
+class IntegerData : public PrimitiveData
+{
+public:
+
+ IntegerData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool);
+ IntegerData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool, Ice::Long);
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ Ice::Long getValue() const;
+ void setValue(Ice::Long, bool);
+
+private:
+
+ bool rangeCheck(Ice::Long, bool) const;
+ static std::string toString(Ice::Long);
+
+ Slice::BuiltinPtr _type;
+ Ice::Long _value;
+};
+typedef IceUtil::Handle<IntegerData> IntegerDataPtr;
+
+class DoubleData : public PrimitiveData
+{
+public:
+
+ DoubleData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool);
+ DoubleData(const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool, double);
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ double getValue() const;
+ void setValue(double);
+
+private:
+
+ Slice::BuiltinPtr _type;
+ double _value;
+};
+typedef IceUtil::Handle<DoubleData> DoubleDataPtr;
+
+class StringData : public PrimitiveData
+{
+public:
+
+ StringData(const DataFactoryPtr&, const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool);
+ StringData(const DataFactoryPtr&, const Slice::BuiltinPtr&, const ErrorReporterPtr&, bool, const std::string&);
+
+ virtual DataPtr getMember(const std::string&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ std::string getValue() const;
+ void setValue(const std::string&);
+
+private:
+
+ DataFactoryPtr _factory;
+ Slice::BuiltinPtr _type;
+ std::string _value;
+ IntegerDataPtr _length;
+};
+typedef IceUtil::Handle<StringData> StringDataPtr;
+
+class ProxyData : public Data
+{
+public:
+
+ ProxyData(const Slice::TypePtr&, const Ice::CommunicatorPtr&, const ErrorReporterPtr&, bool);
+ ProxyData(const Slice::TypePtr&, const Ice::CommunicatorPtr&, const ErrorReporterPtr&, bool, const Ice::ObjectPrx&);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ Ice::ObjectPrx getValue() const;
+ void setValue(const std::string&, bool);
+ void setValue(const Ice::ObjectPrx&);
+
+private:
+
+ Slice::TypePtr _type; // Can be Builtin or Proxy
+ Ice::CommunicatorPtr _communicator;
+ Ice::ObjectPrx _value;
+ std::string _str;
+};
+typedef IceUtil::Handle<ProxyData> ProxyDataPtr;
+
+class StructData : public Data
+{
+public:
+
+ StructData(const DataFactoryPtr&, const Slice::StructPtr&, const ErrorReporterPtr&, bool);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual void destroy();
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ DataMemberMap& getMembers();
+
+private:
+
+ StructData(const Slice::StructPtr&, const ErrorReporterPtr&, bool, const DataMemberMap&);
+
+ Slice::StructPtr _type;
+ DataMemberMap _members;
+};
+typedef IceUtil::Handle<StructData> StructDataPtr;
+
+class SequenceData : public Data
+{
+public:
+
+ SequenceData(const DataFactoryPtr&, const Slice::SequencePtr&, const ErrorReporterPtr&, bool);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ DataList& getElements();
+
+private:
+
+ SequenceData(const DataFactoryPtr&, const Slice::SequencePtr&, const ErrorReporterPtr&, bool, const DataList&);
+
+ DataFactoryPtr _factory;
+ Slice::SequencePtr _type;
+ DataList _elements;
+ IntegerDataPtr _length;
+};
+typedef IceUtil::Handle<SequenceData> SequenceDataPtr;
+
+class EnumData : public Data
+{
+public:
+
+ EnumData(const Slice::EnumPtr&, const ErrorReporterPtr&, bool);
+ EnumData(const Slice::EnumPtr&, const ErrorReporterPtr&, bool, Ice::Int);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ Ice::Int getValue() const;
+ bool setValue(Ice::Int);
+ bool setValueAsString(const std::string&);
+
+private:
+
+ Slice::EnumPtr _type;
+ Ice::Int _value;
+ std::string _name;
+ Ice::Int _count;
+};
+typedef IceUtil::Handle<EnumData> EnumDataPtr;
+
+class DictionaryData : public Data
+{
+public:
+
+ DictionaryData(const DataFactoryPtr&, const Slice::DictionaryPtr&, const ErrorReporterPtr&, bool);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ DataMap& getElements();
+
+private:
+
+ DictionaryData(const DataFactoryPtr&, const Slice::DictionaryPtr&, const ErrorReporterPtr&, bool, const DataMap&);
+
+ DataFactoryPtr _factory;
+ Slice::DictionaryPtr _type;
+ DataMap _map;
+ IntegerDataPtr _length;
+};
+typedef IceUtil::Handle<DictionaryData> DictionaryDataPtr;
+
+class ObjectData : public Data
+{
+public:
+
+ ObjectData(const DataFactoryPtr&, const Slice::TypePtr&, bool);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ DataMemberMap& getMembers();
+
+ void incRef();
+ void decRef();
+
+private:
+
+ void destroyI();
+
+ Slice::TypePtr _type; // Can be Builtin (Object) or ClassDecl
+ DataPtr _facetMap;
+ DataMemberMap _members;
+ Ice::ObjectPtr _marshaler;
+ Ice::Int _refCount;
+ DataPtr _id;
+
+ friend class ObjectWriter;
+ friend class ObjectReader;
+};
+
+class ObjectRef : public Data
+{
+public:
+
+ ObjectRef(const DataFactoryPtr&, const Slice::TypePtr&, bool);
+ ObjectRef(const DataFactoryPtr&, const Slice::TypePtr&, bool, const ObjectDataPtr&);
+
+ virtual DataPtr getMember(const std::string&) const;
+ virtual DataPtr getElement(const DataPtr&) const;
+
+ virtual bool operator==(const Data&) const;
+ virtual bool operator!=(const Data&) const;
+ virtual bool operator<(const Data&) const;
+
+ virtual DataPtr clone() const;
+
+ virtual Slice::TypePtr getType() const;
+ virtual void destroy();
+
+ virtual void marshal(IceInternal::BasicStream&) const;
+ virtual void unmarshal(IceInternal::BasicStream&);
+
+ virtual bool booleanValue(bool = false) const;
+ virtual Ice::Long integerValue(bool = false) const;
+ virtual double doubleValue(bool = false) const;
+ virtual std::string stringValue(bool = false) const;
+ virtual std::string toString() const;
+
+ virtual void visit(DataVisitor&);
+
+ void instantiate();
+ ObjectDataPtr getValue() const;
+ void setValue(const ObjectDataPtr&);
+
+private:
+
+ DataFactoryPtr _factory;
+ Slice::TypePtr _type; // Formal type: can be Builtin (Object) or ClassDecl
+ ObjectDataPtr _value;
+};
+typedef IceUtil::Handle<ObjectRef> ObjectRefPtr;
+
+class ObjectFactory : public Ice::ObjectFactory
+{
+public:
+
+ ObjectFactory(const DataFactoryPtr&, const Slice::UnitPtr&);
+
+ virtual Ice::ObjectPtr create(const std::string&);
+ virtual void destroy();
+
+private:
+
+ DataFactoryPtr _factory;
+ Slice::UnitPtr _unit;
+};
+
+class ClassNotFoundException
+{
+public:
+
+ ClassNotFoundException(const std::string& s) : id(s) {}
+
+ std::string id;
+};
+
+class DataVisitor
+{
+public:
+
+ virtual ~DataVisitor();
+
+ virtual void visitBoolean(const BooleanDataPtr&);
+ virtual void visitInteger(const IntegerDataPtr&);
+ virtual void visitDouble(const DoubleDataPtr&);
+ virtual void visitString(const StringDataPtr&);
+ virtual void visitProxy(const ProxyDataPtr&);
+ virtual void visitStruct(const StructDataPtr&);
+ virtual void visitSequence(const SequenceDataPtr&);
+ virtual void visitEnum(const EnumDataPtr&);
+ virtual void visitDictionary(const DictionaryDataPtr&);
+ virtual void visitObject(const ObjectRefPtr&);
+};
+
+} // End of namespace FreezeScript
+
+#endif