@@ -33,10 +33,9 @@ You can use stamp on a Blob as many times as you like until you are out of Blob
3333Stamp is a C++ object that "bites" chunk of binary data from Blob and converts it
3434into certain structured representation (text string with syntax that is provided
3535by stamp or C-structure)
36-
3736```
3837 char data[] ="abcdefghijk";
39- Blob blob(data, strlen(data)); // Blob with "random" data
38+ auto blob = std::make_shared<Blob> (data, strlen(data)); // Blob with "random" data
4039
4140 StampArithm<short int> stamp; // Stamp for getting short integer (both string and value representations)
4241
@@ -110,10 +109,10 @@ Example:
110109
111110```
112111 char data[] ="abcdefghijk";
113- Blob blob1(data, strlen(data)); // Blob with "random" data
114- Blob blob2(data, strlen(data)); // Another Blob with same data
112+ auto blob1 = std::make_shared<Blob> (data, strlen(data)); // Blob with "random" data
113+ auto blob2 = std::make_shared<Blob> (data, strlen(data)); // Another Blob with same data
115114
116- StampArithm<short int> stamp ; // Stamp for short integer data (both string and value)
115+ auto stamp = std::make_shared< StampArithm<short int>>() ; // Stamp for short integer data (both string and value)
117116
118117 GalleyVectorStr galley_s(stamp);
119118 GalleyVectorV<short int> galley_v(stamp);
@@ -134,10 +133,10 @@ Example:
134133
135134```
136135 char data[] ="abcdefghijk";
137- Blob blob(data, strlen(data)); // Blob with "random" data
136+ auto blob = std::make_shared<Blob> (data, strlen(data)); // Blob with "random" data
138137
139- StampArithm<short int> stamp_i ; // Stamp for short integer data (both string and value)
140- StampArithm<float> stamp_f ; // Stamp for float numeric data (both string and value)
138+ auto stamp_i = std::make_shared< StampArithm<short int>>() ; // Stamp for short integer data (both string and value)
139+ auto stamp_f = std::make_shared< StampArithm<float>>() ; // Stamp for float numeric data (both string and value)
141140
142141 GalleySetStr galley({stamp_i, stamp_f});
143142
@@ -180,7 +179,7 @@ class ComplexIntStamp: public StampBaseStr
180179 public:
181180 virtual int minSize() override;
182181 virtual int maxSize() override;
183- virtual std::string ExtractStr(Blob & blob) override;
182+ virtual std::string ExtractStr(std::shared_ptr< Blob> blob) override;
184183};
185184```
186185Actually here we can have one` StampArithm<short int> ` stamp, and apply it two times.
@@ -205,7 +204,7 @@ Now we will implement Extract Method.
205204We just extract two values with` stampA ` and` stampB ` and combine them into string we want.
206205
207206```
208- std::string ComplexIntStamp::ExtractStr(Blob & blob)
207+ std::string ComplexIntStamp::ExtractStr(std::shared_ptr< Blob> blob)
209208{
210209 std::string A, B;
211210 A = stampA.ExtractStr(blob);
@@ -220,7 +219,7 @@ Now you can use your stamp the way any stamp is used:
220219int main()
221220{
222221 char data[] = "abcdef";
223- Blob blob(data, strlen(data));
222+ auto blob = std::make_shared<Blob> (data, strlen(data));
224223 ComplexIntStamp stamp;
225224
226225 std::string s = stamp.ExtractStr(blob);
@@ -254,7 +253,7 @@ class ComplexIntStamp: public StampBaseV<complex_short>
254253 public:
255254 virtual int minSize() override;
256255 virtual int maxSize() override;
257- virtual complex_short ExtractValue(Blob & blob) override;
256+ virtual complex_short ExtractValue(std::shared_ptr< Blob> blob) override;
258257};
259258```
260259
@@ -277,7 +276,7 @@ In `ExtractValue` method we locally create desired structure, fill it with
277276values fetched from the Blob, and return the structure by value.
278277
279278```
280- complex_short ComplexIntStamp::ExtractValue(Blob & blob)
279+ complex_short ComplexIntStamp::ExtractValue(std::shared_ptr< Blob> blob)
281280{
282281 complex_short res;
283282 res.re = stampA.ExtractValue(blob);
@@ -292,7 +291,7 @@ Then we can use stamp for extracting `complex_short` directly from the Blob:
292291int main()
293292{
294293 char data[] = "abcdef";
295- Blob blob(data, strlen(data));
294+ auto blob = std::make_shared<Blob> (data, strlen(data));
296295 ComplexIntStamp stamp;
297296
298297 complex_short cs = stamp.ExtractValue(blob);
@@ -310,14 +309,13 @@ To add extract method to Galley you should use multiple inheritance.
310309```
311310class ArrayOfComplexIntStamp: public GalleyVectorStr, public StampBaseStr
312311{
313- protected:
314- ComplexIntStamp * item_stamp_p;
315312 public:
316- ComplexIntArrayStamp(): GalleyVectorStr(*(item_stamp_p = new ComplexIntStamp())) {};
317- ~ComplexIntArrayStamp() {delete item_stamp_p;};
313+ ArrayOfComplexIntStamp(): GalleyVectorStr(std::dynamic_pointer_cast<StampBaseStr>(std::make_shared<ComplexIntStamp>())) {};
318314
319- virtual std::string ExtractStr(Blob & blob) override;
315+ virtual std::string ExtractStr(std::shared_ptr< Blob> blob) override;
320316};
317+
318+
321319```
322320Because of initialization order issue, we have to initialize the stamp inside the call of parent class constructor via` new ` method, and then destroy in in the destructor.
323321
@@ -326,7 +324,7 @@ We implement only the Extract method we need.
326324
327325
328326```
329- std::stringComplexIntArrayStamp ::ExtractStr(Blob & blob)
327+ std::stringArrayOfComplexIntStamp ::ExtractStr(std::shared_ptr< Blob> blob)
330328{
331329 std::vector<std::string> data = ExtractStrVector(blob);
332330 std::string res = "";
@@ -403,15 +401,14 @@ If you have Stamp with Value Extract Method, and you are going to use `GalleyVec
403401It would be something like that:
404402
405403```
406- ComplexIntStamp stamp;
404+ auto stamp = std::make_shared<ComplexIntStamp>() ;
407405GalleyVectorV<complex_short> galley(stamp);
408406complex_short *result;
409- int result_size;
410407std::vector<complex_short> vec = galley.ExtractValuesVector(blob);
411- result_len = vec.size();
408+ int result_size = vec.size();
412409
413- result = (complex_short *) malloc(sizeof(complex_short) *result_len) );
414- memcpy((void*) result, (void*) &vec[0], sizeof(complex_short) *result_len );
410+ result = (complex_short *) malloc(sizeof(complex_short) *result_size );
411+ memcpy((void*) result, (void*) &vec[0], sizeof(complex_short) *result_size );
415412```
416413
417414##Further reading