An Overlay-based
Virtual Network Substrate
SpoVNet

source: source/ariba/utility/addressing/facades/address_v.hpp @ 6786

Last change on this file since 6786 was 6786, checked in by mies, 14 years ago

Changed Data to Message conversion constructor in Message to explicit
Fixed some general bugs in Data: operator<<
Fixed bug in DHTMessage: allow unspecified key/values
Added local DHT message delivery
Adapted sources to work with gcc 4.4.1

File size: 5.6 KB
Line 
1#ifndef ADDRESS_V_H_
2#define ADDRESS_V_H_
3
4#include <stdint.h>
5#include <string>
6#include <iostream>
7
8#include "vfacade.hpp"
9
10#include "to_bytes_v.hpp"
11#include "to_string_v.hpp"
12#include "comparable_v.hpp"
13
14#include "../detail/address_convenience.hpp"
15
16namespace ariba {
17namespace addressing {
18
19using std::string;
20
21/**
22 * A virtual interface to a protocol address.
23 *
24 * @author Sebastian Mies <mies@tm.uka.de>
25 */
26class address_v: public detail::address_convenience<address_v> {
27public:
28        //--- to_string_v ---------------------------------------------------------
29
30        /// convert address to a string that can be used to reconstruct the address
31        virtual string to_string() const = 0;
32
33        /// Assigns an address using a human-readable
34        virtual bool assign(const std::string& text) = 0;
35
36        //--- to_bytes_v ----------------------------------------------------------
37
38        /// returns true, if this address has a fixed size in bytes
39        virtual bool is_bytes_size_static() const = 0;
40
41        /// returns the number of bytes used for serialization of this address
42        virtual size_t to_bytes_size() const = 0;
43
44        /// converts this address to a binary representation
45        virtual void to_bytes(uint8_t* bytes) const = 0;
46
47        /// Assigns an address using a bunch of bytes
48        virtual bool assign(const uint8_t* bytes, size_t size) = 0;
49
50        //--- comparable_v --------------------------------------------------------
51
52        /// implements comparison operators
53        virtual int compare_to(const address_v& rhs) const = 0;
54
55        //--- assignment ----------------------------------------------------------
56
57        /// Assigns an address
58        virtual bool assign(const address_v& rhs) = 0;
59
60        //--- address info --------------------------------------------------------
61
62        /// returns the name of the address
63        virtual const string& type_name() const = 0;
64
65        /// sets the type id, if possible
66        virtual uint16_t type_id() const = 0;
67
68        //--- cloneing and conversion ---------------------------------------------
69
70        /// Obtain the underlaying data type or null if it does not match the type
71        virtual void* data(const std::type_info& type) = 0;
72
73        /// Clones this address
74        virtual address_v* clone() const = 0;
75
76        //--- convenience ---------------------------------------------------------
77
78        template<class T>
79        bool instanceof() const {
80                void* value = const_cast<address_v*>(this)->data(typeid(T));
81                return value!=NULL;
82        }
83
84        /// cast operator to detailed type
85        template<class T>
86        inline operator T&() {
87                void* value = data(typeid(T));
88                assert (value!=NULL);
89                return *((T*) value);
90        }
91
92        /// cast operator to detailed type
93        template<class T>
94        inline operator T () const {
95                return T( (const T&)*this );
96        }
97
98        /// cast operator to detailed type
99        template<class T>
100        inline operator const T& () const {
101                void* value = const_cast<address_v*>(this)->data(typeid(T));
102                assert (value!=NULL);
103                return *((const T*) value);
104        }
105};
106
107/// stream operator
108std::ostream& operator<<(std::ostream& s, const address_v* addr);
109
110/// define the virtual facade for the address
111typedef vfacade<address_v> address_vf;
112
113}} // namespace ariba::addressing
114
115/// the virtual adaptor to certain class of objects
116template<class NonVirtual, class AdaptorType>
117class vobject_hull<NonVirtual, ariba::addressing::address_v, AdaptorType> : public ariba::addressing::address_v {
118
119private:
120        typedef ariba::addressing::address_v self;
121        typename AdaptorType::template adaptor_type<NonVirtual> obj;
122
123        static inline NonVirtual& conv(ariba::addressing::address_v* obj) {
124                return *((NonVirtual*) obj->data(typeid(NonVirtual)));
125        }
126
127        static inline const NonVirtual& conv(const ariba::addressing::address_v* obj) {
128                const NonVirtual* v =
129                                (const NonVirtual*) const_cast<ariba::addressing::address_v*> (obj)->data(
130                                                typeid(NonVirtual));
131                return *v;
132        }
133
134public:
135        template<typename T>
136        explicit vobject_hull(T& obj) :
137                obj(obj) {
138        }
139        explicit vobject_hull() :
140                obj() {
141        }
142
143        //--- assignment ----------------------------------------------------------
144
145        /// Assigns an address
146        virtual bool assign(const self& rhs) {
147                return obj->assign(conv(&rhs));
148        }
149
150        //--- address info --------------------------------------------------------
151
152        /// returns the name of the address
153        virtual const string& type_name() const {
154                return obj->type_name();
155        }
156
157        /// returns the id of the address
158        virtual uint16_t type_id() const {
159                return obj->type_id();
160        }
161
162        /// returns a capsule of the object
163        virtual address_v* clone() const {
164                return vcapsule<address_v> (*obj);
165        }
166
167        /// Obtain the underlaying data type or null if it does not match the type
168        virtual void* data(const std::type_info& type) {
169                if (typeid(NonVirtual)!=type) return NULL;
170                return &(*obj);
171        }
172
173        // to_string_v
174
175        /// convert address to a string that can be used to reconstruct the address
176        virtual string to_string() const {
177                return obj->to_string();
178        }
179
180        /// Assigns an address using a human-readable
181        virtual bool assign(const std::string& text) {
182                return obj->assign(text);
183        }
184
185        // comparable_v
186
187        /// implements comparison operators
188        virtual int compare_to(const self& rhs) const {
189                const address_v* compare = dynamic_cast<const address_v*> (&rhs);
190                return obj->compare_to(conv(compare));
191        }
192
193        // to_bytes_v
194
195        /// returns true, if this address has a fixed size in bytes
196        virtual bool is_bytes_size_static() const {
197                return obj->is_bytes_size_static();
198        }
199
200        /// returns the number of bytes used for serialization of this address
201        virtual size_t to_bytes_size() const {
202                return obj->to_bytes_size();
203        }
204
205        /// converts this address to a binary representation
206        virtual void to_bytes(uint8_t* bytes) const {
207                obj->to_bytes(bytes);
208        }
209
210        /// Assigns an address using a bunch of bytes
211        virtual bool assign(const uint8_t* bytes, size_t size) {
212                return obj->assign(bytes, size);
213        }
214
215};
216
217
218#endif /* ADDRESS_V_H_ */
Note: See TracBrowser for help on using the repository browser.