diff options
Diffstat (limited to 'mcop/anyref.h')
-rw-r--r-- | mcop/anyref.h | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/mcop/anyref.h b/mcop/anyref.h new file mode 100644 index 0000000..688f9db --- /dev/null +++ b/mcop/anyref.h @@ -0,0 +1,146 @@ + /* + + Copyright (C) 2000 Stefan Westerfeld + stefan@space.twc.de + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + + */ + +#ifndef MCOP_ANYREF_H +#define MCOP_ANYREF_H + +#include "buffer.h" +#include <string> +#include "arts_export.h" +/* + * BC - Status (2002-03-08): AnyRefBase, AnyRef, AnyConstRef + * + * These classes will be kept binary compatibile. To change it, adding a new + * representation is necessary. No private d pointer for this reason. + */ + +namespace Arts { + +class Any; +class ARTS_EXPORT AnyRefBase { +protected: + void *data; + + /* + * This is used for specifying which is the content of a sequence or + * an enum or similar. For normal types, it remains unset, as their + * name can be generated from rep. + */ + std::string _type; + + /* + * What representation data is pointing to? + * + * repInt (int *), repDouble (double *) and repConstChar (const char *) + * are no native MCOP types, but alternative ways or representing the + * native "int", "float" and "const char *" types + */ + + // BC: adding new representations and types is possible, however, existing + // numbers may not be changed + enum Representation { + repVoid = 0, + repByte = 10, + repLong = 20, repInt = 21 /* treated as long */, + repFloat = 30, repDouble = 31 /* treated as float */, + repString = 40, repCString = 41 /* string */, + repBool = 50, + repByteSeq = 510, + repLongSeq = 520, + repFloatSeq = 530, + repStringSeq = 540, + repBoolSeq = 550, + repAny = 1000 /* may hold any type */ + } rep; + + void _write(Buffer *b) const; + void _read(Buffer *b) const; + + AnyRefBase(const void *data, Representation rep) + : data(const_cast<void *>(data)), rep(rep) { }; + AnyRefBase(const void *data, Representation rep, const char *type) + : data(const_cast<void *>(data)), _type(type), rep(rep) { }; + AnyRefBase(const AnyRefBase ©) + : data(copy.data), _type(copy._type), rep(copy.rep) { } +public: + std::string type() const; +}; + +class ARTS_EXPORT AnyConstRef : public AnyRefBase { +public: + AnyConstRef() : AnyRefBase(0,repVoid) { }; + AnyConstRef(const mcopbyte& value) : AnyRefBase(&value,repByte) { }; + AnyConstRef(const int& value) : AnyRefBase(&value,repInt) { }; + AnyConstRef(const long& value) : AnyRefBase(&value,repLong) { }; + AnyConstRef(const float& value) : AnyRefBase(&value,repFloat) { }; + AnyConstRef(const double& value) : AnyRefBase(&value,repDouble) { }; + AnyConstRef(const std::string& value) : AnyRefBase(&value,repString) { }; + AnyConstRef(const char *value) : AnyRefBase(value,repCString) { }; + AnyConstRef(const bool& value) : AnyRefBase(&value,repBool) { }; + + AnyConstRef(const std::vector<mcopbyte>& v) + : AnyRefBase(&v,repByteSeq) { }; + AnyConstRef(const std::vector<long>& v) + : AnyRefBase(&v,repLongSeq) { }; + AnyConstRef(const std::vector<float>& v) + : AnyRefBase(&v,repFloatSeq) { }; + AnyConstRef(const std::vector<std::string>& v) + : AnyRefBase(&v,repStringSeq) { }; + AnyConstRef(const std::vector<bool>& v) + : AnyRefBase(&v,repBoolSeq) { }; + + AnyConstRef(const Any& value) : AnyRefBase(&value,repAny) { }; + + AnyConstRef(const AnyConstRef& ref) : AnyRefBase(ref) { } + void write(Buffer *b) const { _write(b); } +}; + +class ARTS_EXPORT AnyRef : public AnyRefBase { +public: + AnyRef() : AnyRefBase(0,repVoid) { }; + + // primitive types + AnyRef(mcopbyte& value) : AnyRefBase(&value,repByte) { }; + AnyRef(int& value) : AnyRefBase(&value,repInt) { }; + AnyRef(long& value) : AnyRefBase(&value,repLong) { }; + AnyRef(float& value) : AnyRefBase(&value,repFloat) { }; + AnyRef(double& value) : AnyRefBase(&value,repDouble) { }; + AnyRef(std::string& value) : AnyRefBase(&value,repString) { }; + AnyRef(bool& value) : AnyRefBase(&value,repBool) { }; + + // sequence of primitive types + AnyRef(std::vector<mcopbyte>& value) : AnyRefBase(&value,repByteSeq) { }; + AnyRef(std::vector<long>& value) : AnyRefBase(&value,repLongSeq) { }; + AnyRef(std::vector<float>& value) : AnyRefBase(&value,repFloatSeq) { }; + AnyRef(std::vector<std::string>& value) : AnyRefBase(&value,repStringSeq){}; + AnyRef(std::vector<bool>& value) : AnyRefBase(&value,repBoolSeq){}; + + AnyRef(Any& value) : AnyRefBase(&value,repAny) { }; + + AnyRef(const AnyRef& ref) : AnyRefBase(ref) { } + + void read(Buffer *b) const { _read(b); } + void write(Buffer *b) const { _write(b); } +}; + +} +#endif /* MCOP_ANYREF_H */ |