3232
3333#include " test-chars-stamps.h"
3434
35+ // tmp
36+ #include < fstream>
37+
3538using namespace TAP ;
3639
3740char short_sample[]=" 1234567" ;
@@ -54,7 +57,7 @@ class PoolPickerStamp : public virtual StampBaseStr
5457
5558public:
5659PoolPickerStamp (std::vector<std::shared_ptr<StampBaseStr>> new_pool);
57- ~PoolPickerStamp () {fprintf (stderr," DESTROY!\n " );};
60+ // ~PoolPickerStamp() {fprintf(stderr, "DESTROY!\n");};
5861
5962 std::stringExtractStr (std::shared_ptr<Blob> blob)override ;
6063virtual void add_weak (std::shared_ptr<StampBaseStr> stamp);
@@ -80,9 +83,9 @@ PoolPickerStamp::isRecursive()
8083if (is_recursive || is_in_recursion)
8184return true ;
8285 is_in_recursion =true ;
83- for (auto stamp :pool )
86+ for (auto stamp :weak_pool )
8487 {
85- if (stamp->isRecursive ())
88+ if (stamp. lock () ->isRecursive ())
8689 {
8790 is_recursive =true ;// Once recursive -- recursive forever.
8891 is_in_recursion =false ;
@@ -100,13 +103,22 @@ PoolPickerStamp::ExtractStr(std::shared_ptr<Blob> blob)
100103 ORACLE_TYPE oracle = stamp_oracle.ExtractValue (blob);
101104
102105 std::vector<std::weak_ptr<StampBaseStr>> target_pool;
103- for (auto stamp : weak_pool)
106+ std::vector<std::weak_ptr<StampBaseStr>> unbounded_pool;
107+
108+ for (auto stamp_w : weak_pool)
104109 {
105- if (stamp.lock ()->minSize () <= blob->Size ())
110+ auto stamp = stamp_w.lock ();
111+ if (stamp->minSize () <= blob->Size ())
106112 {
107- target_pool.push_back (stamp);
113+ target_pool.push_back (stamp_w);
114+ if (stamp->maxSize () == -1 || stamp->maxSize () >= blob->Size ())
115+ {
116+ unbounded_pool.push_back (stamp_w);
117+ }
108118 }
109119 }
120+ if (unbounded_pool.size ()>0 )
121+ target_pool = unbounded_pool;
110122
111123size_t index =OracleProportion (oracle,0 , target_pool.size () -1 );
112124return target_pool[index].lock ()->ExtractStr (blob);
@@ -115,20 +127,22 @@ PoolPickerStamp::ExtractStr(std::shared_ptr<Blob> blob)
115127int
116128PoolPickerStamp::minSize ()
117129{
118- int res = INT_MAX;
130+ int res = INT_MAX / 2 ;
119131/* Do not check is_recursive here: even if stamp is known to be recursive we
120132 * still should iterate all his non-recursive children to find real minimal
121133 * size*/
122134if (is_in_recursion)
123135return res;
124- is_in_recursion =1 ;/* Do not use isRecursive() inside as it uses same flag*/
125- for (auto stamp :pool )
136+ is_in_recursion =true ;/* Do not use isRecursive() inside as it uses same flag*/
137+ for (auto stamp :weak_pool )
126138 {
127- int candidat = stamp->minSize ();
139+ int candidat = stamp. lock () ->minSize ();
128140if (res > candidat)
129141 res = candidat;
130142 }
131- is_in_recursion =0 ;
143+ is_in_recursion =false ;
144+ if (res == INT_MAX /2 )
145+ return INT_MAX /2 ;
132146 res += ORACLE_SIZE;
133147return res;
134148}
@@ -139,16 +153,19 @@ PoolPickerStamp::maxSize()
139153int res =0 ;
140154if (is_recursive || is_in_recursion)
141155return -1 ;
142- is_in_recursion =1 ;/* Do not use isRecursive() inside as it uses same flag*/
143- for (auto stamp :pool )
156+ is_in_recursion =true ;/* Do not use isRecursive() inside as it uses same flag*/
157+ for (auto stamp :weak_pool )
144158 {
145- int candidat = stamp->maxSize ();
159+ int candidat = stamp. lock () ->maxSize ();
146160if (candidat == -1 )
161+ {
162+ is_in_recursion =false ;
147163return -1 ;
164+ }
148165if (res < candidat)
149166 res = candidat;
150167 }
151- is_in_recursion =0 ;
168+ is_in_recursion =false ;
152169 res += ORACLE_SIZE;
153170return res;
154171}
@@ -172,6 +189,9 @@ class StampJSONString : public virtual StampDictT<DictLCAlphaSmall>
172189protected:
173190public:
174191 std::stringExtractStr (std::shared_ptr<Blob> blob)override ;
192+ virtual int minSize ()override {return 8 ;};
193+ virtual int maxSize ()override {return 8 ;};
194+
175195};
176196
177197
@@ -250,6 +270,7 @@ StampJSON::StampJSON()
250270add_weak (stamp_i);
251271add_weak (stamp_f);
252272add_weak (stamp_s);
273+
253274add_weak (stamp_a);
254275add_weak (stamp_h);
255276}
@@ -258,37 +279,27 @@ StampJSON::StampJSON()
258279int
259280main ()
260281{
261- auto stamp_d = std::make_shared<StampJSONString>();
262- auto stamp_i = std::make_shared<StampJSONInt>();
263- auto stamp_f = std::make_shared<StampJSONFloat>();
264-
265-
266- // PoolPickerStamp stamp({stamp_i, stamp_f, stamp_d});
267- std::shared_ptr<PoolPickerStamp>picker (new PoolPickerStamp ({stamp_f, stamp_i, stamp_d}));
268- // picker->add_weak(picker);
269- auto stamp_a = std::make_shared<StampJSONArray>(picker);
270- picker->add_weak (stamp_a);
282+ // std::fstream f{"/dev/random"};
283+ std::fstream f{" buf" };
284+ if (!f)
285+ std::cerr <<" Unable to open file" ;
271286
272- auto stamp_h = std::make_shared<StampJSONHash>(picker );
273- picker-> add_weak (stamp_h );
287+ std::vector< char > buffer ( 128 , 0 );
288+ f. read (&buffer[ 0 ], buffer. size () );
274289
275- fprintf (stderr," hash sizes= %i %i\n " ,stamp_h->minSize (), stamp_h->maxSize ());
290+ // auto blob = std::make_shared<Blob>((char *)bin_sample, strlen((char *)bin_sample));
291+ auto blob = std::make_shared<Blob>(&buffer[0 ], buffer.size ());
276292
277-
278- auto blob = std::make_shared<Blob>((char *)bin_sample,strlen ((char *)bin_sample));
279293
280294auto stamp_j = std::make_shared<StampJSON>();
281295
282- fprintf (stderr," %i %i\n " ,stamp_a->minSize (), stamp_a->maxSize ());
283- // for(int i =0; i<25; i++)
284- {
285- // std::string s = stamp_a->ExtractStr(blob);
286- std::string s = stamp_h->ExtractStr (blob);
296+ // printf("%i\n", stamp_j->minSize());
287297
288- fprintf (stderr," %i %s\n " ,picker->isRecursive (), s.c_str ());
289- }
298+ std::string s = stamp_j->ExtractStr (blob);
290299
300+ printf (" %s\n " , s.c_str ());
291301
302+ /*
292303
293304 TEST_START(6);
294305 {
@@ -300,5 +311,5 @@ main()
300311 is(OracleProportion(65535-256,0,255), 254);
301312
302313 }
303- TEST_END;
314+ TEST_END;*/
304315}