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

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

Update overlap compare template specialized on BitBlock? type to
load_unaligned. Updated test generator. Added template file.

File size: 3.9 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_test(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
94
95int main() {
96
97    const int size = 69;
98    const char * x = "x";
99    const char * y = "y";
100
101    ostringstream buffer;
102
103    buffer << gen_data_array(x, size);
104    buffer << gen_data_array_not_equal(y, size);
105   
106    buffer << "cout << \"overlap_compare<uint8_t,i>(x,y)\" << endl;" << endl;
107    for(int i=sizeof(uint8_t);i<=size;i++) {
108        buffer << gen_overlap_compare_test("uint8_t", i, x, i, x, i);
109    }
110
111    for(int i=sizeof(uint8_t);i<=size;i++) {
112        buffer << gen_overlap_compare_test("uint8_t", i, x, i, y, i);
113    }
114
115    buffer << "cout << \"overlap_compare<uint16_t,i>(x,y)\" << endl;" << endl;
116    for(int i=sizeof(uint16_t);i<=size;i++) {
117        buffer << gen_overlap_compare_test("uint16_t", i, x, i, x, i);
118    }
119
120    for(int i=sizeof(uint16_t);i<=size;i++) {
121        buffer << gen_overlap_compare_test("uint16_t", i, x, i, y, i);
122    }
123
124    buffer << "cout << \"overlap_compare<uint32_t,i>(x,y)\" << endl;" << endl;
125    for(int i=sizeof(uint32_t);i<=size;i++) {
126        buffer << gen_overlap_compare_test("uint32_t", i, x, i, x, i);
127    }
128
129    for(int i=sizeof(uint32_t);i<=size;i++) {
130        buffer << gen_overlap_compare_test("uint32_t", i, x, i, y, i);
131    }
132
133    buffer << "cout << \"overlap_compare<uint64_t,i>(x,y)\" << endl;" << endl;
134    for(int i=sizeof(uint64_t);i<=size;i++) {
135        buffer << gen_overlap_compare_test("uint64_t", i, x, i, x, i);
136    }
137
138    for(int i=sizeof(uint64_t);i<=size;i++) {
139        buffer << gen_overlap_compare_test("uint64_t", i, x, i, y, i);
140    }
141
142    buffer << "cout << \"overlap_compare<BitBlock,i>(x,y)\" << endl;" << endl;
143    for(int i=sizeof(BitBlock);i<=size;i++) {
144        buffer << gen_overlap_compare_test("BitBlock", i, x, i, x, i);
145    }
146
147    for(int i=sizeof(BitBlock);i<=size;i++) {
148        buffer << gen_overlap_compare_test("BitBlock", i, x, i, y, i);
149    }
150    string test_cases = buffer.str();
151
152    string template_filename("byte_compare_template.cpp");
153    string test_filename("byte_compare_test.cpp");
154    string target("@tests");
155
156    string template_buffer = read_file(template_filename);
157    template_buffer.replace(template_buffer.find(target), target.length(), test_cases);
158    write_file(test_filename, template_buffer);
159
160    return 1;
161}
162
Note: See TracBrowser for help on using the repository browser.