00001 #ifndef PROTON_INTERNAL_DATA_HPP
00002 #define PROTON_INTERNAL_DATA_HPP
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "../internal/object.hpp"
00026 #include "../types_fwd.hpp"
00027
00028 struct pn_data_t;
00029
00030 namespace proton {
00031
00032 class value;
00033
00034 namespace internal {
00035
00038 class data : public object<pn_data_t> {
00040 data(pn_data_t* d) : internal::object<pn_data_t>(d) {}
00041
00042 public:
00044 data() : internal::object<pn_data_t>(0) {}
00045
00047 PN_CPP_EXTERN static data create();
00048
00050 PN_CPP_EXTERN void copy(const data&);
00051
00053 PN_CPP_EXTERN void clear();
00054
00056 PN_CPP_EXTERN void rewind();
00057
00059 PN_CPP_EXTERN bool empty() const;
00060
00062 PN_CPP_EXTERN int append(data src);
00063
00065 PN_CPP_EXTERN int appendn(data src, int limit);
00066
00067 PN_CPP_EXTERN bool next();
00068 PN_CPP_EXTERN void* point() const;
00069 PN_CPP_EXTERN void restore(void* h);
00070
00071 protected:
00072 void narrow();
00073 void widen();
00074
00075 friend class internal::factory<data>;
00076 friend struct state_guard;
00077 friend PN_CPP_EXTERN std::ostream& operator<<(std::ostream&, const data&);
00078 };
00080
00085 struct state_guard {
00087 data& data_;
00088 void* point_;
00089 bool cancel_;
00091
00093 state_guard(data& d) : data_(d), point_(data_.point()), cancel_(false) {}
00095
00096 ~state_guard() { if (!cancel_) data_.restore(point_); }
00097
00099 void cancel() { cancel_ = true; }
00100 };
00101
00102 }
00103 }
00104
00105 #endif // PROTON_INTERNAL_DATA_HPP