Skip to content

Commit d248fd8

Browse files
committed
Minimal implementaion - still lots to do but getting there.
1 parent 54e14cc commit d248fd8

File tree

6 files changed

+185
-738
lines changed

6 files changed

+185
-738
lines changed

mainframe/expression.hpp

Lines changed: 67 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -132,27 +132,30 @@ struct is_expression<T &, void>
132132
{};
133133

134134
template< typename T >
135-
struct expr_column
135+
struct column_name
136136
{
137-
expr_column()
137+
column_name()
138138
: m_colnum( std::numeric_limits<decltype(m_colnum)>::max )
139139
{
140140
}
141141

142-
bool bind_column( const std::string& name, size_t num )
142+
void set_column_name( size_t col, std::string name )
143143
{
144-
if ( m_name == name ) {
145-
m_colnum = num;
146-
return true;
144+
if ( name == m_name ) {
145+
m_colnum = col;
147146
}
148-
return false;
149147
}
150148

151149
template< typename ... Ts >
152150
const T& get_value( const frame_iterator< Ts... >& fi ) const
153151
{
154-
T& val = fi.template get<m_colnum>();
155-
return val;
152+
return fi.get( m_colnum );
153+
}
154+
155+
template< typename ... Ts >
156+
T& get_value( frame_iterator< Ts... >& fi ) const
157+
{
158+
return fi.get( m_colnum );
156159
}
157160

158161
std::string m_name;
@@ -167,13 +170,18 @@ struct terminal
167170

168171
terminal( T _t ) : t( _t ) {}
169172

170-
bool bind_column( const std::string&, size_t )
173+
void set_column_name( size_t, std::string )
174+
{
175+
}
176+
177+
template< typename ... Ts >
178+
const T& get_value( const frame_iterator<Ts...>& )
171179
{
172-
return false;
180+
return t;
173181
}
174182

175183
template< typename ... Ts >
176-
const T& get_value( const frame_iterator< Ts... >& ) const
184+
T& get_value( const frame_iterator<Ts...>& )
177185
{
178186
return t;
179187
}
@@ -182,16 +190,16 @@ struct terminal
182190
};
183191

184192
template< typename T >
185-
struct terminal< expr_column<T> >
193+
struct terminal< column_name<T> >
186194
{
187195
using is_expr = void;
188196
using return_type = T;
189197

190-
terminal( expr_column<T> _t ) : t( _t ) {}
198+
terminal( column_name<T> _t ) : t( _t ) {}
191199

192-
bool bind_column( const std::string& name, size_t num )
200+
void set_column_name( size_t colind, std::string colname )
193201
{
194-
return t.bind_column( name, num );
202+
t.set_column_name( colind, colname );
195203
}
196204

197205
template< typename ... Ts >
@@ -200,29 +208,40 @@ struct terminal< expr_column<T> >
200208
return t.get_value( fi );
201209
}
202210

203-
expr_column<T> t;
211+
template< typename ... Ts >
212+
T& get_value( frame_iterator< Ts... >& fi )
213+
{
214+
return t.get_value( fi );
215+
}
216+
217+
column_name<T> t;
204218
};
205219

206-
template< template <typename, typename> typename Op, typename L, typename R >
220+
template< template <typename, typename> class Op, typename L, typename R >
207221
struct binary_expr
208222
{
209223
using is_expr = void;
210224
using op = Op<typename L::return_type, typename R::return_type>;
211225
using return_type = typename op::return_type;
212-
static_assert( is_expression<L>::value );
213-
static_assert( is_expression<R>::value );
226+
static_assert( is_expression<L>::value , "binary expression left must be expression" );
227+
static_assert( is_expression<R>::value , "binary expression right must be expression" );
214228

215229
binary_expr( L _l, R _r ) : l( _l ), r( _r ) {}
216230

217-
bool bind_column( const std::string& name, size_t num )
231+
void set_column_name( size_t colind, std::string colname )
218232
{
219-
auto lb = l.bind_column( name, num );
220-
auto rb = r.bind_column( name, num );
221-
return lb || rb;
233+
l.set_column_name( colind, colname );
234+
r.set_column_name( colind, colname );
222235
}
223236

224237
template< typename ... Ts >
225-
return_type get_value( const frame_iterator< Ts... >& fi ) const
238+
const return_type& get_value( const frame_iterator< Ts... >& fi ) const
239+
{
240+
return op::exec( l.get_value( fi ), r.get_value( fi ) );
241+
}
242+
243+
template< typename ... Ts >
244+
return_type& get_value( frame_iterator< Ts... >& fi )
226245
{
227246
return op::exec( l.get_value( fi ), r.get_value( fi ) );
228247
}
@@ -234,23 +253,29 @@ struct binary_expr
234253
// Op is a member type in expr_op
235254
// T must be either terminal<>, unary_expr<>, or binary_expr<> (no
236255
// unwrapped types - that's why make_unary_expr exists)
237-
template< template <typename> typename Op, typename T >
256+
template< template <typename> class Op, typename T >
238257
struct unary_expr
239258
{
240259
using is_expr = void;
241260
using op = Op<typename T::return_type>;
242261
using return_type = typename op::return_type;
243-
static_assert( is_expression<T>::value );
262+
static_assert( is_expression<T>::value , "unary expression must contain expression");
244263

245264
unary_expr( T _t ) : t( _t ) {}
246265

247-
bool bind_column( const std::string& name, size_t num )
266+
void set_column_name( size_t colind, std::string colname )
248267
{
249-
return t.bind_expr_column( name, num );
268+
t.set_column_name( colind, colname );
250269
}
251270

252271
template< typename ... Ts >
253-
return_type get_value( const frame_iterator< Ts... >& fi ) const
272+
const return_type& get_value( const frame_iterator< Ts... >& fi ) const
273+
{
274+
return op::exec( t.get_value( fi ) );
275+
}
276+
277+
template< typename ... Ts >
278+
return_type& get_value( frame_iterator< Ts... >& fi )
254279
{
255280
return op::exec( t.get_value( fi ) );
256281
}
@@ -283,7 +308,7 @@ struct maybe_wrap<terminal<T>>
283308
}
284309
};
285310

286-
template<template <typename> typename Op, typename T>
311+
template<template <typename> class Op, typename T>
287312
struct maybe_wrap<unary_expr<Op, T>>
288313
{
289314
maybe_wrap() = delete;
@@ -294,7 +319,7 @@ struct maybe_wrap<unary_expr<Op, T>>
294319
}
295320
};
296321

297-
template<template <typename, typename> typename Op, typename L, typename R>
322+
template<template <typename, typename> class Op, typename L, typename R>
298323
struct maybe_wrap<binary_expr<Op, L, R>>
299324
{
300325
maybe_wrap() = delete;
@@ -305,7 +330,7 @@ struct maybe_wrap<binary_expr<Op, L, R>>
305330
}
306331
};
307332

308-
template< template <typename> typename Op, typename T >
333+
template< template <typename> class Op, typename T >
309334
struct make_unary_expr
310335
{
311336
make_unary_expr() = delete;
@@ -318,7 +343,7 @@ struct make_unary_expr
318343
}
319344
};
320345

321-
template< template <typename, typename> typename Op, typename L, typename R >
346+
template< template <typename, typename> class Op, typename L, typename R >
322347
struct make_binary_expr
323348
{
324349
make_binary_expr() = delete;
@@ -332,11 +357,11 @@ struct make_binary_expr
332357
};
333358

334359
template< typename T >
335-
terminal<expr_column<T>> col( const char * colname )
360+
terminal<column_name<T>> col( const char * colname )
336361
{
337-
expr_column<T> c;
362+
column_name<T> c;
338363
c.name = colname;
339-
return maybe_wrap<expr_column<T>>::wrap( c );
364+
return maybe_wrap<column_name<T>>::wrap( c );
340365
}
341366

342367
template< typename L, typename R >
@@ -429,10 +454,11 @@ typename std::enable_if<is_expression<T>::value, typename make_unary_expr<expr_o
429454
return make_unary_expr<expr_op::NOT, T>::create( t );
430455
}
431456

432-
//terminal<expr_column_name> col( std::string colname )
433-
//{
434-
// return terminal<expr_column_name>{ expr_column_name{ colname } };
435-
//}
457+
template< typename T >
458+
terminal< column_name<T> > col( const std::string & colname )
459+
{
460+
return terminal< column_name<T> >{ column_name<T>{ colname } };
461+
}
436462

437463

438464
} // namespace mf

0 commit comments

Comments
 (0)