Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5db502b

Browse files
Now StamJSON works as it should
1 parent 5224579 commit 5db502b

File tree

1 file changed

+72
-10
lines changed

1 file changed

+72
-10
lines changed

t/321-galley-recursion-experiments_2.cpp

Lines changed: 72 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ PoolPickerStamp::isRecursive()
9696
std::string
9797
PoolPickerStamp::ExtractStr(std::shared_ptr<Blob> blob)
9898
{
99-
fprintf(stderr, "*");
10099
static 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::string ExtractStr(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

197258
int
198259
main()
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-
//
206261
auto stamp_d = std::make_shared<StampJSONString>();
207262
auto stamp_i = std::make_shared<StampJSONInt>();
208263
auto 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);
214269
auto 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

221282
fprintf(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

226288
fprintf(stderr,"%i %s\n",picker->isRecursive(), s.c_str());
227289
}

0 commit comments

Comments
 (0)