SHOW:
|
|
- or go back to the newest paste.
1 | #include <algorithm> // std::for_each | |
2 | - | #include <bitset> // std::bitset |
2 | + | |
3 | - | #include <iomanip> // std::setw |
3 | + | #include <iterator> // std::ostream_iterator |
4 | #include <stddef.h> // ptrdiff_t | |
5 | #include <stdexcept> // std::exception, std::runtime_error | |
6 | #include <stdlib.h> // EXIT_SUCCESS, EXIT_FAILURE | |
7 | #include <string> // std::string, std::wstring | |
8 | - | #include <string> // std::wstring |
8 | + | |
9 | #include <vector> // std::vector | |
10 | ||
11 | using namespace std; | |
12 | typedef ptrdiff_t Size; | |
13 | ||
14 | bool throwX( string const& s ) { throw runtime_error( s ); } | |
15 | ||
16 | template< class C > | |
17 | auto rbegin( C& c ) -> decltype( c.rbegin() ) { return c.rbegin(); } | |
18 | ||
19 | template< class C > | |
20 | auto rend( C& c ) -> decltype( c.rend() ) { return c.rend(); } | |
21 | ||
22 | template< class Elem > | |
23 | - | template< class Container > |
23 | + | |
24 | - | Size countOf( Container const& c ) { return end( c ) - begin( c ); } |
24 | + | |
25 | v.emplace_back( move( newElem ) ); | |
26 | } | |
27 | ||
28 | namespace growDirection { enum Enum{ prepend, append }; } | |
29 | namespace patternType { enum Enum { pure, gray }; } | |
30 | ||
31 | struct Options | |
32 | { | |
33 | growDirection::Enum direction; | |
34 | patternType::Enum type; | |
35 | ||
36 | Options(): direction(), type() {} | |
37 | ||
38 | Options( int const argc, char const* const argv[] ) | |
39 | : direction() | |
40 | , type() | |
41 | { | |
42 | - | if( strcmp( argv[i], "-append" ) == 0 ) |
42 | + | |
43 | { | |
44 | if( string( argv[i] ) == "-append" ) | |
45 | { | |
46 | - | else if( strcmp( argv[i], "-reflect" ) == 0 ) |
46 | + | |
47 | } | |
48 | else if( string( argv[i] ) == "-reflect" ) | |
49 | { | |
50 | type = patternType::gray; | |
51 | } | |
52 | else | |
53 | { | |
54 | throwX( string() + "Usage: " + argv[0] + " [-reflect][-append]" ); | |
55 | } | |
56 | } | |
57 | } | |
58 | }; | |
59 | ||
60 | template< class It > | |
61 | void addExtendedStringsTo( | |
62 | vector<wstring>& result, | |
63 | wchar_t const d, | |
64 | It const itSourceBegin, | |
65 | It const itSourceEnd, | |
66 | growDirection::Enum direction | |
67 | ) | |
68 | { | |
69 | for_each( itSourceBegin, itSourceEnd, [&]( wstring const& s ) | |
70 | { | |
71 | result += (direction == growDirection::append? s + d : d + s); | |
72 | } ); | |
73 | } | |
74 | ||
75 | vector<wstring> extended( vector<wstring> const& patterns, Options const& opt ) | |
76 | { | |
77 | vector<wstring> result; | |
78 | ||
79 | addExtendedStringsTo( | |
80 | result, L'0', begin( patterns ), end( patterns ), opt.direction | |
81 | ); | |
82 | ||
83 | switch( opt.type ) | |
84 | { | |
85 | case patternType::pure: | |
86 | addExtendedStringsTo( | |
87 | result, L'1', begin( patterns ), end( patterns ), opt.direction | |
88 | ); | |
89 | break; | |
90 | case patternType::gray: | |
91 | addExtendedStringsTo( | |
92 | result, L'1', rbegin( patterns ), rend( patterns ), opt.direction | |
93 | ); | |
94 | } | |
95 | return result; | |
96 | } | |
97 | ||
98 | void display( vector<wstring> const& patterns ) | |
99 | { | |
100 | for( auto it = begin( patterns); it != end( patterns ); ++it ) | |
101 | { | |
102 | if( it > begin( patterns ) ) { wcout << L" "; } | |
103 | wcout << *it; | |
104 | } | |
105 | wcout << endl; | |
106 | } | |
107 | ||
108 | void cppMain( Options const& options ) | |
109 | { | |
110 | vector<wstring> patterns( 1, L"" ); | |
111 | ||
112 | for( int i = 1; i <= 3; ++i ) | |
113 | { | |
114 | patterns = extended( patterns, options ); | |
115 | display( patterns ); | |
116 | } | |
117 | } | |
118 | ||
119 | int main( int argc, char* argv[] ) | |
120 | { | |
121 | try | |
122 | { | |
123 | cppMain( Options( argc, argv ) ); | |
124 | return EXIT_SUCCESS; | |
125 | } | |
126 | catch( exception const& x ) | |
127 | { | |
128 | wcerr << "!" << x.what() << endl; | |
129 | } | |
130 | return EXIT_FAILURE; | |
131 | } |