Changeset 18666 for lang/c/msgpack
- Timestamp:
- 09/02/08 22:14:58 (5 years ago)
- Location:
- lang/c/msgpack/trunk/cpp
- Files:
-
- 3 modified
-
test.cpp (modified) (2 diffs)
-
unpack.cpp (modified) (5 diffs)
-
unpack.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
lang/c/msgpack/trunk/cpp/test.cpp
r18657 r18666 170 170 while(stream.good() && total_bytes > 0) { 171 171 172 // 1. reserve buffer 172 173 upk.reserve_buffer(RESERVE_SIZE); 174 175 // 2. read data to buffer() up to buffer_capacity() bytes 173 176 size_t sz = stream.readsome( 174 177 (char*)upk.buffer(), … … 180 183 << std::endl; 181 184 185 // 3. specify the number of bytes actually copied 182 186 upk.buffer_consumed(sz); 187 188 // 4. repeat execute() until it returns false 183 189 while( upk.execute() ) { 184 190 std::cout << "message parsed" << std::endl; 191 192 // 5.1. take out the parsed object 193 msgpack::object o = upk.data(); 194 195 // 5.2. the parsed object is valid until the zone is deleted 185 196 boost::scoped_ptr<msgpack::zone> pz(upk.release_zone()); 186 msgpack::object o = upk.data(); 187 upk.reset(); 197 188 198 std::cout << o << std::endl; 189 199 ++num_msg; 200 201 // 5.3 re-initialize unpacker 202 upk.reset(); 190 203 } 191 204 -
lang/c/msgpack/trunk/cpp/unpack.cpp
r18657 r18666 83 83 84 84 // FIXME realloc? 85 86 85 void* tmp = malloc(next_size); 87 86 if(!tmp) { throw std::bad_alloc(); } … … 122 121 return false; 123 122 } else { 123 expand_buffer(0); 124 124 return true; 125 125 } … … 128 128 zone* unpacker::release_zone() 129 129 { 130 zone* nz = new zone(); 130 131 zone* z = m_zone; 131 m_zone = NULL; 132 m_zone = new zone(); 132 m_zone = nz; 133 133 m_ctx->user(m_zone); 134 134 return z; … … 142 142 void unpacker::reset() 143 143 { 144 if(m_off != 0) { expand_buffer(0); } 144 145 if(!m_zone->empty()) { 145 146 delete m_zone; … … 147 148 m_zone = new zone(); 148 149 } 149 expand_buffer(0);150 150 m_ctx->reset(); 151 151 } -
lang/c/msgpack/trunk/cpp/unpack.hpp
r18657 r18666 25 25 26 26 public: 27 /*! 1. reserve buffer. at least `len' bytes of capacity will be ready */ 27 28 void reserve_buffer(size_t len); 29 30 /*! 2. read data to the buffer() up to buffer_capacity() bytes */ 28 31 void* buffer(); 29 32 size_t buffer_capacity() const; 33 34 /*! 3. specify the number of bytes actually copied */ 30 35 void buffer_consumed(size_t len); 36 37 /*! 4. repeat execute() until it retunrs false */ 31 38 bool execute(); 32 zone* release_zone(); // never throw 39 40 /*! 5.1. if execute() returns true, take out the parsed object */ 33 41 object data(); 42 43 /*! 5.2. the parsed object is valid until the zone is deleted */ 44 // Note that once release_zone() from unpacker, you must delete it 45 // otherwise the memrory will leak. 46 zone* release_zone(); 47 48 /*! 5.3. after release_zone(), re-initialize unpacker */ 34 49 void reset(); 50 51 public: 52 // These functions are usable when non-MessagePack message follows after 53 // MessagePack message. 54 // Note that there are no parsed buffer when execute() returned true. 55 56 /*! get address of buffer that is not parsed */ 57 void* nonparsed_buffer(); 58 size_t nonparsed_size() const; 59 60 /*! get the number of bytes that is already parsed */ 61 size_t parsed_size() const; 62 63 /*! remove unparsed buffer from unpacker */ 64 // Note that reset() leaves non-parsed buffer. 65 void remove_nonparsed_buffer(); 35 66 36 67 private: … … 73 104 74 105 106 inline void* unpacker::nonparsed_buffer() 107 { return (void*)(((char*)m_buffer)+m_off); } 108 109 inline size_t unpacker::nonparsed_size() const 110 { return m_used - m_off; } 111 112 inline size_t unpacker::parsed_size() const 113 { return m_off; } 114 115 inline void unpacker::remove_nonparsed_buffer() 116 { m_used = m_off; } 117 118 75 119 inline object unpack(const void* data, size_t len, zone& z) 76 120 {
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)