You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
arts/mcop/anyref.h

147 lines
5.0 KiB

/*
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., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, 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 &copy)
: 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 */