@@ -96,7 +96,6 @@ PoolPickerStamp::isRecursive()
9696std::string
9797PoolPickerStamp::ExtractStr (std::shared_ptr<Blob> blob)
9898{
99- fprintf (stderr," *" );
10099static ORACLE_STAMP stamp_oracle;
101100 ORACLE_TYPE oracle = stamp_oracle.ExtractValue (blob);
102101
@@ -192,36 +191,99 @@ class StampJSONArray: public StampStrEnumerator
192191 :StampStrEnumerator(picker," ," ," [" ," ]" ) {};
193192};
194193
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+ }
195256
196257
197258int
198259main ()
199260{
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- //
206261auto stamp_d = std::make_shared<StampJSONString>();
207262auto stamp_i = std::make_shared<StampJSONInt>();
208263auto stamp_f = std::make_shared<StampJSONFloat>();
209264
210265
211266// 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}));
213268// picker->add_weak(picker);
214269auto stamp_a = std::make_shared<StampJSONArray>(picker);
215270 picker->add_weak (stamp_a);
216271
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+
217277
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));
219279
280+ auto stamp_j = std::make_shared<StampJSON>();
220281
221282fprintf (stderr," %i %i\n " ,stamp_a->minSize (), stamp_a->maxSize ());
222283// for(int i =0; i<25; i++)
223284 {
224- std::string s = stamp_a->ExtractStr (blob);
285+ // std::string s = stamp_a->ExtractStr(blob);
286+ std::string s = stamp_h->ExtractStr (blob);
225287
226288fprintf (stderr," %i %s\n " ,picker->isRecursive (), s.c_str ());
227289 }