-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkarma00.cpp
158 lines (122 loc) · 2.98 KB
/
karma00.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <boost\config\warning_disable.hpp>
#include <cstdlib>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <boost\spirit\include\karma.hpp>
#include <boost\lambda\lambda.hpp>
using namespace boost::spirit;
using boost::spirit::ascii::space;
using boost::lambda::_1;
namespace client {
namespace karma = boost::spirit::karma;
using provide_type = std::string;
template< typename OutputIterator>
struct test_grammar : karma::grammar<OutputIterator, std::vector<provide_type>()>
{
test_grammar() : test_grammar::base_type(query)
{
query = *(karma::string << '\n');
}
karma::rule<OutputIterator, std::vector<provide_type>()> query;
};
}
void main() {
/*
* iterator adapter
2 + 3;
+ 2 3 ; test(1,2) ==> test(), 1 2 -> function tpy 연산자(operator)
2 3 +
* C++ concepts
//iterator basic concept
for( IT it = begin(); it != end(); ++it){ //++it, !=
std::cout << *it; //*it
}
*/
using sink_type = std::ostream_iterator<const char>;
//sink_type sinker(std::cout);
std::ofstream op("karma_test.txt");
sink_type sinker(op);
sinker = 'a';
std::string h = "\nhello\n";
std::copy(std::begin(h), std::end(h), sinker);
std::vector<int> v(8); //사이즈 8개 할당
std::generate(v.begin(), v.end(), std::rand);
auto generator1 = *int_; //예를 들면 데이터 형식이 {1,2,3} => 123 으로변경 시켜줌
std::cout << karma::format(
generator1,
v) // v 는 어트리뷰트 타입 즉, 실제 만들어진 데이터
<< std::endl;
karma::generate(
sinker,//output iterator <<-generatored characters
generator1, // generator
v //attribute : output type
);
sinker = '\n';
std::cout <<
karma::format_delimited(
generator1, // generator
space, // generator
v
) << std::endl;
auto generator2 = lit('[') << *int_ << ']';
std::cout <<
karma::format_delimited(
generator2, // generator
space, // generator
v
) << std::endl;
auto generator3 = int_ % ","; // 콤마가 델리게이트 입니다.
std::cout <<
karma::format_delimited(
generator3, // generator
space, // generator
v
) << std::endl;
/*
html list 구문
*/
auto generator4 = "<ol>" << *verbatim[" <li>" << int_ << "</li>"] << "</ol>";
std::cout <<
karma::format_delimited(
generator4,
'\n',
v
) << std::endl;
auto generator5 = *verbatim["|" << right_align[int_] << "|"]; //left_align, right_align, center
std::cout <<
karma::format_delimited(
generator5,
'\n',
v
) << std::endl;
auto lambda = [](int& val) {
val *= 100;
};
auto generator6 = *int_[lambda];
std::cout <<
karma::format_delimited(
generator6,
'\n',
v
) << std::endl;
auto generator7 = *int_[::_1 = -::_1 * 100];
std::cout <<
karma::format_delimited(
generator7,
'\n',
v
) << std::endl;
std::vector<std::string> sourcer;
sourcer.push_back("hellow");
sourcer.push_back("world");
client::test_grammar<sink_type> sink_grammar;
karma::generate_delimited(
sinker,
sink_grammar,
"^_^",
sourcer
);
}