1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/**
* Available field types for AMQP
*
* @copyright 2014 - 2020 Copernica BV
*/
/**
* Include guard
*/
#pragma once
/**
* Dependencies
*/
#include <memory>
/**
* Set up namespace
*/
namespace AMQP {
/**
* Forward declarations
*/
class InBuffer;
class OutBuffer;
class Array;
class Table;
/**
* Base field class
*
* This class cannot be constructed, but serves
* as the base class for all AMQP field types
*/
class Field
{
protected:
/**
* Decode a field by fetching a type and full field from a frame
* The returned field is allocated on the heap!
* @param frame
* @return std::unique_ptr<Field>
*/
static std::unique_ptr<Field> decode(InBuffer &frame);
public:
/**
* Destructor
*/
virtual ~Field() {}
/**
* Create a new instance on the heap of this object, identical to the object passed
* @return Field*
*/
virtual std::unique_ptr<Field> clone() const = 0;
/**
* Get the size this field will take when
* encoded in the AMQP wire-frame format
* @return size_t
*/
virtual size_t size() const = 0;
/**
* Write encoded payload to the given buffer.
* @param buffer
*/
virtual void fill(OutBuffer& buffer) const = 0;
/**
* Get the type ID that is used to identify this type of
* field in a field table
* @return char
*/
virtual char typeID() const = 0;
/**
* Output the object to a stream
* @param std::ostream
*/
virtual void output(std::ostream &stream) const = 0;
/**
* Casting operators
* @return mixed
*/
virtual operator const std::string& () const;
virtual operator const char * () const { return nullptr; }
virtual operator uint8_t () const { return 0; }
virtual operator uint16_t () const { return 0; }
virtual operator uint32_t () const { return 0; }
virtual operator uint64_t () const { return 0; }
virtual operator int8_t () const { return 0; }
virtual operator int16_t () const { return 0; }
virtual operator int32_t () const { return 0; }
virtual operator int64_t () const { return 0; }
virtual operator float () const { return 0; }
virtual operator double () const { return 0; }
virtual operator const Array& () const;
virtual operator const Table& () const;
/**
* Check the field type
*
* @return Is the field a specific type?
*/
virtual bool isInteger() const { return false; }
virtual bool isDecimal() const { return false; }
virtual bool isArray() const { return false; }
virtual bool isTable() const { return false; }
virtual bool isBoolean() const { return false; }
virtual bool isString() const { return false; }
virtual bool isVoid() const { return false; }
};
/**
* Custom output stream operator
* @param stream
* @param field
* @return ostream
*/
inline std::ostream &operator<<(std::ostream &stream, const Field &field)
{
field.output(stream);
return stream;
}
/**
* end namespace
*/
}
|