Skip to content

Commit 6a2c43f

Browse files
Some experements with recursion galley
1 parent 2fcace2 commit 6a2c43f

File tree

1 file changed

+253
-0
lines changed

1 file changed

+253
-0
lines changed
Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
/******************************************************************************
2+
*
3+
* Copyright 2021 Nikolay Shaplov (Postgres Professional)
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
******************************************************************************/
18+
19+
#include <string.h>
20+
21+
#include <exception>
22+
#include <string>
23+
#include <cstdlib>
24+
#include <vector>
25+
#define WANT_TEST_EXTRAS
26+
#include <tap++/tap++.h>
27+
28+
#include "blobstamper/blobstamper.h"
29+
30+
#include "test-chars-stamps.h"
31+
32+
using namespace TAP;
33+
34+
char short_sample[]="1234567";
35+
char longer_sample[]="z1234567*89abcde&fghijklmnopqrstuvwxyzAB%CDEFGHIJKLMNOPQRSTUVWXYZ!";
36+
37+
38+
//class SimpeRecursionNode;
39+
//class TestRNode1;
40+
//class TestRNode2;
41+
//class TestRNode3;
42+
43+
44+
template<class T> class WeightedRef
45+
{
46+
public:
47+
std::reference_wrapper<T> ref;
48+
char weight;
49+
WeightedRef(T& arg_ref): ref{arg_ref}, weight{1} {}
50+
WeightedRef(T& arg_ref, char weight_arg): ref{arg_ref}, weight{weight_arg} {}
51+
};
52+
53+
54+
template<class T> class WeightedRefPicker
55+
{
56+
std::vector<WeightedRef<T>> vec;
57+
public:
58+
WeightedRefPicker(std::initializer_list<WeightedRef<T>> arg): vec{arg} {}
59+
std::reference_wrapper<T> pick(unsigned char c);
60+
};
61+
62+
63+
template<class T> std::reference_wrapper<T>
64+
WeightedRefPicker<T>::pick(unsigned char c)
65+
{
66+
unsigned char max = 255;
67+
int total = 0;
68+
for(WeightedRef<T> & wr : vec)
69+
{
70+
total += wr.weight;
71+
}
72+
double step = (double)max / total;
73+
int i = 0;
74+
double sum = 0;
75+
76+
77+
for(WeightedRef<T> & wr : vec)
78+
{
79+
sum += step * wr.weight;
80+
if (c <= sum)
81+
return wr.ref;
82+
}
83+
84+
// there mught be problem with precision that will not allow us to catch last item
85+
// but delta should be small. In other cases terminating
86+
if (abs(c-sum) >0.1)
87+
{
88+
fprintf(stderr,"Something is really wrong\n");
89+
exit(1);
90+
}
91+
return vec.back().ref;
92+
}
93+
94+
95+
96+
97+
class GalleySimpleRecusion;
98+
99+
100+
class SimpeRecursionNode: public StampBase
101+
{
102+
103+
public:
104+
GalleySimpleRecusion * recursor;
105+
virtual std::string do_recursion(Blob &blob) = 0;
106+
107+
};
108+
class TestRNode1: public SimpeRecursionNode
109+
{
110+
public:
111+
virtual std::string do_recursion(Blob &blob) override;
112+
int minSize() override {return 1; }; // FIXME correct it
113+
int maxSize() override {return -1;}; /* Sereies always takes as much data as it can take */
114+
};
115+
class TestRNode2: public SimpeRecursionNode
116+
{
117+
public:
118+
virtual std::string do_recursion(Blob &blob) override;
119+
int minSize() override {return 1; }; // FIXME correct it
120+
int maxSize() override {return -1;}; /* Sereies always takes as much data as it can take */
121+
};
122+
class TestRNode3: public SimpeRecursionNode
123+
{
124+
public:
125+
virtual std::string do_recursion(Blob &blob) override;
126+
int minSize() override {return 1; }; // FIXME correct it
127+
int maxSize() override {return -1;}; /* Sereies always takes as much data as it can take */
128+
};
129+
130+
class GalleySimpleRecusion : public GalleyBase
131+
{
132+
TestRNode1 node1;
133+
TestRNode2 node2;
134+
TestRNode3 node3;
135+
136+
std::vector<std::reference_wrapper<SimpeRecursionNode>> stamps = {node1, node2, node3};
137+
138+
public:
139+
int minSize() override {return 1; }; // FIXME correct it
140+
int maxSize() override {return -1;}; /* Sereies always takes as much data as it can take */
141+
142+
143+
virtual std::string do_recursion(Blob &blob);
144+
145+
};
146+
147+
148+
149+
150+
std::string
151+
TestRNode1::do_recursion(Blob &blob)
152+
{
153+
try{
154+
Blob tmp = blob.ShiftBytes(1);
155+
}
156+
catch (OutOfData)
157+
{
158+
return "0";
159+
}
160+
161+
return "1 + " + recursor->do_recursion(blob);
162+
}
163+
164+
std::string
165+
TestRNode2::do_recursion(Blob &blob)
166+
{
167+
try{
168+
Blob tmp = blob.ShiftBytes(1);
169+
}
170+
catch (OutOfData)
171+
{
172+
return "0";
173+
}
174+
175+
return "2 + " + recursor->do_recursion(blob);
176+
}
177+
178+
179+
std::string
180+
TestRNode3::do_recursion(Blob &blob)
181+
{
182+
try{
183+
Blob tmp = blob.ShiftBytes(1);
184+
}
185+
catch (OutOfData)
186+
{
187+
return "0";
188+
}
189+
190+
return "3 + " + recursor->do_recursion(blob);
191+
}
192+
193+
std::string
194+
GalleySimpleRecusion::do_recursion(Blob& blob)
195+
{
196+
StampArithm<char> stamp_char;
197+
char c;
198+
try{
199+
c = stamp_char.ExtractValue(blob);
200+
}
201+
catch (OutOfData)
202+
{
203+
return "0";
204+
}
205+
206+
c = c % 3;
207+
208+
SimpeRecursionNode &node = stamps[c];
209+
// TestRNode3 node;
210+
node.recursor = this;
211+
return node.do_recursion(blob);
212+
}
213+
214+
215+
216+
217+
218+
219+
int
220+
main()
221+
{
222+
223+
char c1='a';
224+
char c2='b';
225+
char c3='c';
226+
char c4='d';
227+
228+
WeightedRefPicker<char> wrp {{c1,1},{c2,2},{c3,3},{c4,4}};
229+
230+
for(int i = 0; i<=255;i+=1)
231+
{
232+
char &rc = wrp.pick(i);
233+
fprintf(stderr,"^^ %i %c\n",i,rc);
234+
235+
}
236+
237+
TEST_START(1);
238+
{
239+
Blob blob(short_sample, strlen(short_sample));
240+
GalleySimpleRecusion galley;
241+
242+
fprintf(stderr,"--1\n");
243+
244+
std::string str = galley.do_recursion(blob);
245+
246+
fprintf(stderr,"--99\n");
247+
248+
fprintf(stderr,"-- %s --\n",str.c_str());
249+
250+
ok(1);
251+
}
252+
TEST_END;
253+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy