source: trunk/lib/test/byte_compare_generator.cpp @ 1838

Last change on this file since 1838 was 1838, checked in by ksherdy, 7 years ago

Added general case.

File size: 4.8 KB
Line 
1#include "byte_compare.hpp"
2#include <stdint.h>
3#include <iostream>
4#include <fstream>
5#include <sstream>
6using namespace std;
7
8string read_file(string filename) {
9
10    ifstream file(filename.c_str());
11
12    if (!file) {
13        cerr << "Error: " << filename << endl;
14        abort();
15    }
16
17    std::stringstream buffer;
18    buffer << file.rdbuf();
19    file.close();
20    return buffer.str();
21}
22
23void write_file(string filename, string contents) {
24    ofstream file(filename.c_str());
25
26    if (!file) {
27        cerr << "Error: " << filename << endl;
28        abort();
29    }
30
31    file << contents;
32    file.close();
33}
34
35string gen_data_array(string name, int size) {
36
37    ostringstream ostr;
38    ostr << "const char *" << name << "[] = {" << endl;
39
40    for(int i=0; i <= size; i++) {
41        ostr << "\"";
42        for(int j=1; j<=i;j++) {
43            ostr << j % 10;
44        }
45        ostr << "\"";
46        if(i<size) {
47            ostr << ",";
48        }
49        ostr << endl;
50    }
51
52    ostr << "};" << endl;
53    return ostr.str();
54}
55
56string gen_data_array_not_equal(string name, int size) {
57
58    ostringstream ostr;
59    ostr << "const char *" << name << "[] = {" << endl;
60
61    for(int i=0; i <= size; i++) {
62        ostr << "\"";
63        for(int j=1; j<=(i-1);j++) {
64            ostr << j % 10;
65        }
66        ostr << 'b';
67        ostr << "\"";
68        if(i<size) {
69            ostr << ",";
70        }
71        ostr << endl;
72    }
73
74    ostr << "};" << endl;
75    return ostr.str();
76}
77
78
79string gen_overlap_compare_call_T_L(string type, int lgth, string x, int idx_x, string y, int idx_y) {
80
81    ostringstream ostr;
82    ostr << "cout << \""
83         << "x=\\\"\" << " << x << "[" << idx_x << "]" << "<< \"\\\""
84         << " y=\\\"\" << " << y << "[" << idx_y << "]" << "<< \"\\\""
85         << " L=" << lgth << " "
86         << " R=\" << overlap_compare<" << type << "," << lgth << ">(" << "(" << type << "*)&"
87         << x << "[" << idx_x << "]"<< ",(" << type << "*)&"
88         << y << "[" << idx_y << "]"<< ")"
89         << " << endl;" <<endl;
90
91    return ostr.str();
92}
93
94string gen_overlap_compare_call_T(string type, int lgth, string x, int idx_x, string y, int idx_y) {
95
96    ostringstream ostr;
97    ostr << "cout << \""
98         << "x=\\\"\" << " << x << "[" << idx_x << "]" << "<< \"\\\""
99         << " y=\\\"\" << " << y << "[" << idx_y << "]" << "<< \"\\\""
100         << " L=" << lgth << " "
101         << " R=\" << overlap_compare<" << type << "," << ">(" << "(" << type << "*)&"
102         << x << "[" << idx_x << "]"<< ",(" << type << "*)&"
103         << y << "[" << idx_y << "] ,"
104         << lgth << ")"
105         << " << endl;" <<endl;
106
107    return ostr.str();
108}
109
110int main() {
111
112    const int size = 69;
113    const char * x = "x";
114    const char * y = "y";
115
116    ostringstream buffer;
117
118    buffer << gen_data_array(x, size);
119    buffer << gen_data_array_not_equal(y, size);
120   
121    buffer << "cout << \"overlap_compare<uint8_t,i>(x,y)\" << endl;" << endl;
122    for(int i=sizeof(uint8_t);i<=size;i++) {
123        buffer << gen_overlap_compare_call_T_L("uint8_t", i, x, i, x, i);
124    }
125
126    for(int i=sizeof(uint8_t);i<=size;i++) {
127        buffer << gen_overlap_compare_call_T_L("uint8_t", i, x, i, y, i);
128    }
129
130    buffer << "cout << \"overlap_compare<uint16_t,i>(x,y)\" << endl;" << endl;
131    for(int i=sizeof(uint16_t);i<=size;i++) {
132        buffer << gen_overlap_compare_call_T_L("uint16_t", i, x, i, x, i);
133    }
134
135    for(int i=sizeof(uint16_t);i<=size;i++) {
136        buffer << gen_overlap_compare_call_T_L("uint16_t", i, x, i, y, i);
137    }
138
139    buffer << "cout << \"overlap_compare<uint32_t,i>(x,y)\" << endl;" << endl;
140    for(int i=sizeof(uint32_t);i<=size;i++) {
141        buffer << gen_overlap_compare_call_T_L("uint32_t", i, x, i, x, i);
142    }
143
144    for(int i=sizeof(uint32_t);i<=size;i++) {
145        buffer << gen_overlap_compare_call_T_L("uint32_t", i, x, i, y, i);
146    }
147
148    buffer << "cout << \"overlap_compare<uint64_t,i>(x,y)\" << endl;" << endl;
149    for(int i=sizeof(uint64_t);i<=size;i++) {
150        buffer << gen_overlap_compare_call_T_L("uint64_t", i, x, i, x, i);
151    }
152
153    for(int i=sizeof(uint64_t);i<=size;i++) {
154        buffer << gen_overlap_compare_call_T_L("uint64_t", i, x, i, y, i);
155    }
156
157    buffer << "cout << \"overlap_compare<BitBlock,i>(x,y)\" << endl;" << endl;
158    for(int i=sizeof(BitBlock);i<=size;i++) {
159        buffer << gen_overlap_compare_call_T_L("BitBlock", i, x, i, x, i);
160    }
161
162    for(int i=sizeof(BitBlock);i<=size;i++) {
163        buffer << gen_overlap_compare_call_T_L("BitBlock", i, x, i, y, i);
164    }
165
166    buffer << "cout << \"overlap_compare<BitBlock>(x,y,lgth)\" << endl;" << endl;
167    for(int i=sizeof(BitBlock);i<=size;i++) {
168        buffer << gen_overlap_compare_call_T("BitBlock", i, x, i, x, i);
169    }
170
171    for(int i=sizeof(BitBlock);i<=size;i++) {
172        buffer << gen_overlap_compare_call_T("BitBlock", i, x, i, y, i);
173    }
174
175    string test_cases = buffer.str();
176
177    string template_filename("byte_compare_template.cpp");
178    string test_filename("byte_compare_test.cpp");
179    string target("@tests");
180
181    string template_buffer = read_file(template_filename);
182    template_buffer.replace(template_buffer.find(target), target.length(), test_cases);
183    write_file(test_filename, template_buffer);
184
185    return 1;
186}
187
Note: See TracBrowser for help on using the repository browser.