@@ -96,7 +96,6 @@ PoolPickerStamp::isRecursive()
96
96
std::string
97
97
PoolPickerStamp::ExtractStr (std::shared_ptr<Blob> blob)
98
98
{
99
- fprintf (stderr," *" );
100
99
static ORACLE_STAMP stamp_oracle;
101
100
ORACLE_TYPE oracle = stamp_oracle.ExtractValue (blob);
102
101
@@ -192,36 +191,99 @@ class StampJSONArray: public StampStrEnumerator
192
191
:StampStrEnumerator(picker," ," ," [" ," ]" ) {};
193
192
};
194
193
194
+ class StampJSONHashEl :public StampBaseStr
195
+ {
196
+ private:
197
+ std::shared_ptr<StampJSONString> stamp_name;
198
+ std::shared_ptr<PoolPickerStamp> stamp_value;
199
+ public:
200
+ StampJSONHashEl (std::shared_ptr<PoolPickerStamp> picker)
201
+ :stamp_value(picker), stamp_name(std::make_shared<StampJSONString>()) {};
202
+ virtual int minSize ()override {return stamp_name->minSize () + stamp_value->minSize ();};
203
+ virtual int maxSize ()override {return -1 ;};
204
+ std::stringExtractStr (std::shared_ptr<Blob> blob)override ;
205
+ };
206
+
207
+ std::string
208
+ StampJSONHashEl::ExtractStr (std::shared_ptr<Blob> blob)
209
+ {
210
+ std::string n = stamp_name->ExtractStr (blob);
211
+ std::string v = stamp_value->ExtractStr (blob);
212
+ return n +" :" + v;
213
+ }
214
+
215
+ class StampJSONHash :public StampStrEnumerator
216
+ {
217
+ private:
218
+ std::shared_ptr<StampJSONHashEl> stamp_el;
219
+ public:
220
+ StampJSONHash (std::shared_ptr<PoolPickerStamp> picker)
221
+ :StampStrEnumerator(stamp_el = std::make_shared<StampJSONHashEl>(picker)," ," ," {" ," }" ) {};
222
+ };
223
+
224
+
225
+ class StampJSON :public PoolPickerStamp
226
+ {
227
+ private:
228
+ std::shared_ptr<StampJSONString> stamp_s;
229
+ std::shared_ptr<StampJSONInt> stamp_i;
230
+ std::shared_ptr<StampJSONFloat> stamp_f;
231
+ std::shared_ptr<StampJSONArray> stamp_a;
232
+ std::shared_ptr<StampJSONHash> stamp_h;
233
+
234
+ public:
235
+ StampJSON ();
236
+ };
237
+
238
+ void null_deleter (StampJSON *) {}
239
+
240
+ StampJSON::StampJSON ()
241
+ : PoolPickerStamp({})
242
+ {
243
+ stamp_i = std::make_shared<StampJSONInt>();
244
+ stamp_f = std::make_shared<StampJSONFloat>();
245
+ stamp_s = std::make_shared<StampJSONString>();
246
+
247
+ // FIXME Так не надо делеать!!!! null_deleter -- зло.
248
+ stamp_a = std::make_shared<StampJSONArray>(std::shared_ptr<StampJSON>(this , null_deleter));
249
+ stamp_h = std::make_shared<StampJSONHash>(std::shared_ptr<StampJSON>(this , null_deleter));
250
+ add_weak (stamp_i);
251
+ add_weak (stamp_f);
252
+ add_weak (stamp_s);
253
+ add_weak (stamp_a);
254
+ add_weak (stamp_h);
255
+ }
195
256
196
257
197
258
int
198
259
main ()
199
260
{
200
- // auto dict =std::make_shared<DictLCAlphaSmall>();
201
- // auto stamp_d = std::make_shared<StampDict>(dict);
202
- // auto stamp_d = std::make_shared<StampDictT<DictLCAlphaSmall>>();
203
- // auto stamp_i = std::make_shared<StampArithm<long int>>();
204
- // auto stamp_f = std::make_shared<StampArithm<float>>();
205
- //
206
261
auto stamp_d = std::make_shared<StampJSONString>();
207
262
auto stamp_i = std::make_shared<StampJSONInt>();
208
263
auto stamp_f = std::make_shared<StampJSONFloat>();
209
264
210
265
211
266
// PoolPickerStamp stamp({stamp_i, stamp_f, stamp_d});
212
- std::shared_ptr<PoolPickerStamp>picker (new PoolPickerStamp ({stamp_i, stamp_f , stamp_d}));
267
+ std::shared_ptr<PoolPickerStamp>picker (new PoolPickerStamp ({stamp_f, stamp_i , stamp_d}));
213
268
// picker->add_weak(picker);
214
269
auto stamp_a = std::make_shared<StampJSONArray>(picker);
215
270
picker->add_weak (stamp_a);
216
271
272
+ auto stamp_h = std::make_shared<StampJSONHash>(picker);
273
+ picker->add_weak (stamp_h);
274
+
275
+ fprintf (stderr," hash sizes= %i %i\n " ,stamp_h->minSize (), stamp_h->maxSize ());
276
+
217
277
218
- std::shared_ptr<Blob> blob = std::make_shared<Blob>((char *)bin_sample,strlen ((char *)bin_sample));
278
+ auto blob = std::make_shared<Blob>((char *)bin_sample,strlen ((char *)bin_sample));
219
279
280
+ auto stamp_j = std::make_shared<StampJSON>();
220
281
221
282
fprintf (stderr," %i %i\n " ,stamp_a->minSize (), stamp_a->maxSize ());
222
283
// for(int i =0; i<25; i++)
223
284
{
224
- std::string s = stamp_a->ExtractStr (blob);
285
+ // std::string s = stamp_a->ExtractStr(blob);
286
+ std::string s = stamp_h->ExtractStr (blob);
225
287
226
288
fprintf (stderr," %i %s\n " ,picker->isRecursive (), s.c_str ());
227
289
}