Updating the changelog in the VERSION file, and version_sync.
[shapes.git] / source / astexpr_relational.cc
blobc3aa648f52385e395caf080eabe19de5f62a0394
1 /* This file is part of Shapes.
3 * Shapes is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * any later version.
8 * Shapes is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with Shapes. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright 2008 Henrik Tidefelt
19 #include <cmath>
21 #include "astexprs.h"
22 #include "shapesexceptions.h"
23 #include "lighttypes.h"
25 using namespace Shapes;
26 using namespace std;
29 RefCountPtr< const Lang::Value >
30 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
32 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 < *arg2 ) );
35 RefCountPtr< const Lang::Value >
36 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
38 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ < arg2->val_ ) );
41 RefCountPtr< const Lang::Value >
42 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
44 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ < arg2->val_ ) );
47 RefCountPtr< const Lang::Value >
48 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
50 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) < arg2->get( ) ) );
53 RefCountPtr< const Lang::Value >
54 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
56 Lang::PathPoint2D * res = new Lang::PathPoint2D( arg2 );
57 res->rear_ = arg1;
58 return Kernel::ValueRef( res );
61 RefCountPtr< const Lang::Value >
62 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
64 Lang::PathPoint2D * res = new Lang::PathPoint2D( *arg2 );
65 if( res->rear_.getPtr( ) != 0 )
67 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a rear handle" ) );
69 res->rear_ = arg1;
70 return Kernel::ValueRef( res );
73 RefCountPtr< const Lang::Value >
74 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::PathSlider2D ) arg2, const Kernel::PassedDyn & dyn ) const
76 if( arg2->getRear( ) != NullPtr< const Lang::Value >( ) )
78 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a rear handle" ) );
80 return Kernel::ValueRef( new Lang::PathSlider2D_rear( *arg2, arg1 ) );
83 RefCountPtr< const Lang::Value >
84 Ast::LessExpr::impl( DUMMYANDREF( const Lang::PolarHandleBase ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
86 Lang::PathPoint2D * res = new Lang::PathPoint2D( arg2 );
87 res->rear_ = arg1;
88 return Kernel::ValueRef( res );
91 RefCountPtr< const Lang::Value >
92 Ast::LessExpr::impl( DUMMYANDREF( const Lang::PolarHandleBase ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
94 Lang::PathPoint2D * res = new Lang::PathPoint2D( *arg2 );
95 if( res->rear_.getPtr( ) != 0 )
97 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a rear handle" ) );
99 res->rear_ = arg1;
100 return Kernel::ValueRef( res );
103 RefCountPtr< const Lang::Value >
104 Ast::LessExpr::impl( DUMMYANDREF( const Lang::PolarHandleBase ) arg1, DUMMYANDREF( const Lang::PathSlider2D ) arg2, const Kernel::PassedDyn & dyn ) const
106 if( arg2->getRear( ) != NullPtr< const Lang::Value >( ) )
108 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a rear handle" ) );
110 return Kernel::ValueRef( new Lang::PathSlider2D_rear( *arg2, arg1 ) );
113 RefCountPtr< const Lang::Value >
114 Ast::LessExpr::impl( DUMMYANDREF( const Lang::CornerCoords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
116 throw Exceptions::MiscellaneousRequirement( strrefdup( "A handle mustn't have a default angle." ) );
119 RefCountPtr< const Lang::Value >
120 Ast::LessExpr::impl( DUMMYANDREF( const Lang::CornerCoords2D ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
122 throw Exceptions::MiscellaneousRequirement( strrefdup( "A handle mustn't have a default angle." ) );
125 RefCountPtr< const Lang::Value >
126 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
128 Lang::PathPoint3D * res = new Lang::PathPoint3D( arg2 );
129 res->rear_ = arg1;
130 return Kernel::ValueRef( res );
133 RefCountPtr< const Lang::Value >
134 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::PathPoint3D ) arg2, const Kernel::PassedDyn & dyn ) const
136 Lang::PathPoint3D * res = new Lang::PathPoint3D( *arg2 );
137 if( res->rear_.getPtr( ) != 0 )
139 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a rear handle" ) );
141 res->rear_ = arg1;
142 return Kernel::ValueRef( res );
145 RefCountPtr< const Lang::Value >
146 Ast::LessExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::PathSlider3D ) arg2, const Kernel::PassedDyn & dyn ) const
148 if( arg2->getRear( ) != NullPtr< const Lang::Value >( ) )
150 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a rear handle" ) );
152 return Kernel::ValueRef( new Lang::PathSlider3D_rear( *arg2, arg1 ) );
156 RefCountPtr< const Lang::Value >
157 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
159 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 > *arg2 ) );
162 RefCountPtr< const Lang::Value >
163 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
165 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ > arg2->val_ ) );
168 RefCountPtr< const Lang::Value >
169 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
171 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ > arg2->val_ ) );
174 RefCountPtr< const Lang::Value >
175 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
177 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) > arg2->get( ) ) );
180 RefCountPtr< const Lang::Value >
181 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
183 Lang::PathPoint2D * res = new Lang::PathPoint2D( arg1 );
184 res->front_ = arg2;
185 return Kernel::ValueRef( res );
188 RefCountPtr< const Lang::Value >
189 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
191 Lang::PathPoint2D * res = new Lang::PathPoint2D( *arg1 );
192 if( res->front_.getPtr( ) != 0 )
194 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a front handle" ) );
196 res->front_ = arg2;
197 return Kernel::ValueRef( res );
200 RefCountPtr< const Lang::Value >
201 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
203 if( arg1->getFront( ) != NullPtr< const Lang::Value >( ) )
205 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a front handle" ) );
207 return Kernel::ValueRef( new Lang::PathSlider2D_front( *arg1, arg2 ) );
210 RefCountPtr< const Lang::Value >
211 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::PolarHandleBase ) arg2, const Kernel::PassedDyn & dyn ) const
213 Lang::PathPoint2D * res = new Lang::PathPoint2D( arg1 );
214 res->front_ = arg2;
215 return Kernel::ValueRef( res );
218 RefCountPtr< const Lang::Value >
219 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::PolarHandleBase ) arg2, const Kernel::PassedDyn & dyn ) const
221 Lang::PathPoint2D * res = new Lang::PathPoint2D( *arg1 );
222 if( res->front_.getPtr( ) != 0 )
224 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a front handle" ) );
226 res->front_ = arg2;
227 return Kernel::ValueRef( res );
230 RefCountPtr< const Lang::Value >
231 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::PolarHandleBase ) arg2, const Kernel::PassedDyn & dyn ) const
233 if( arg1->getFront( ) != NullPtr< const Lang::Value >( ) )
235 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a front handle" ) );
237 return Kernel::ValueRef( new Lang::PathSlider2D_front( *arg1, arg2 ) );
240 RefCountPtr< const Lang::Value >
241 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::CornerCoords2D ) arg2, const Kernel::PassedDyn & dyn ) const
243 throw Exceptions::MiscellaneousRequirement( strrefdup( "A handle mustn't have a default angle." ) );
246 RefCountPtr< const Lang::Value >
247 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::CornerCoords2D ) arg2, const Kernel::PassedDyn & dyn ) const
249 throw Exceptions::MiscellaneousRequirement( strrefdup( "A handle mustn't have a default angle." ) );
252 RefCountPtr< const Lang::Value >
253 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
255 Lang::PathPoint3D * res = new Lang::PathPoint3D( arg1 );
256 res->front_ = arg2;
257 return Kernel::ValueRef( res );
260 RefCountPtr< const Lang::Value >
261 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathPoint3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
263 Lang::PathPoint3D * res = new Lang::PathPoint3D( *arg1 );
264 if( res->front_.getPtr( ) != 0 )
266 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Pathpoint already has a front handle" ) );
268 res->front_ = arg2;
269 return Kernel::ValueRef( res );
272 RefCountPtr< const Lang::Value >
273 Ast::GreaterExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
275 if( arg1->getFront( ) != NullPtr< const Lang::Value >( ) )
277 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Slider already has a front handle" ) );
279 return Kernel::ValueRef( new Lang::PathSlider3D_front( *arg1, arg2 ) );
283 RefCountPtr< const Lang::Value >
284 Ast::EqualExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
286 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 == *arg2 ) );
289 RefCountPtr< const Lang::Value >
290 Ast::EqualExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
292 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ == arg2->val_ ) );
295 RefCountPtr< const Lang::Value >
296 Ast::EqualExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
298 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ == arg2->val_ ) );
301 RefCountPtr< const Lang::Value >
302 Ast::EqualExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
304 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) == arg2->get( ) ) );
307 RefCountPtr< const Lang::Value >
308 Ast::EqualExpr::impl( DUMMYANDREF( const Lang::Class ) arg1, DUMMYANDREF( const Lang::Class ) arg2, const Kernel::PassedDyn & dyn ) const
310 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1 == arg2 ) );
314 RefCountPtr< const Lang::Value >
315 Ast::NotEqualExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
317 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 != *arg2 ) );
320 RefCountPtr< const Lang::Value >
321 Ast::NotEqualExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
323 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ != arg2->val_ ) );
326 RefCountPtr< const Lang::Value >
327 Ast::NotEqualExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
329 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ != arg2->val_ ) );
332 RefCountPtr< const Lang::Value >
333 Ast::NotEqualExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
335 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) != arg2->get( ) ) );
338 RefCountPtr< const Lang::Value >
339 Ast::NotEqualExpr::impl( DUMMYANDREF( const Lang::Class ) arg1, DUMMYANDREF( const Lang::Class ) arg2, const Kernel::PassedDyn & dyn ) const
341 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1 != arg2 ) );
345 RefCountPtr< const Lang::Value >
346 Ast::LessEqualExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
348 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 <= *arg2 ) );
351 RefCountPtr< const Lang::Value >
352 Ast::LessEqualExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
354 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ <= arg2->val_ ) );
357 RefCountPtr< const Lang::Value >
358 Ast::LessEqualExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
360 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ <= arg2->val_ ) );
363 RefCountPtr< const Lang::Value >
364 Ast::LessEqualExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
366 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) <= arg2->get( ) ) );
370 RefCountPtr< const Lang::Value >
371 Ast::GreaterEqualExpr::impl( DUMMYANDREF( const Lang::Symbol ) arg1, DUMMYANDREF( const Lang::Symbol ) arg2, const Kernel::PassedDyn & dyn ) const
373 return RefCountPtr< const Lang::Value >( new Lang::Boolean( *arg1 >= *arg2 ) );
376 RefCountPtr< const Lang::Value >
377 Ast::GreaterEqualExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
379 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ >= arg2->val_ ) );
382 RefCountPtr< const Lang::Value >
383 Ast::GreaterEqualExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
385 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ >= arg2->val_ ) );
388 RefCountPtr< const Lang::Value >
389 Ast::GreaterEqualExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
391 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->get( ) >= arg2->get( ) ) );
395 RefCountPtr< const Lang::Value >
396 Ast::AndExpr::impl( DUMMYANDREF( const Lang::Boolean ) arg1, DUMMYANDREF( const Lang::Boolean ) arg2, const Kernel::PassedDyn & dyn ) const
398 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ && arg2->val_ ) );
402 RefCountPtr< const Lang::Value >
403 Ast::OrExpr::impl( DUMMYANDREF( const Lang::Boolean ) arg1, DUMMYANDREF( const Lang::Boolean ) arg2, const Kernel::PassedDyn & dyn ) const
405 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ || arg2->val_ ) );
409 RefCountPtr< const Lang::Value >
410 Ast::XorExpr::impl( DUMMYANDREF( const Lang::Boolean ) arg1, DUMMYANDREF( const Lang::Boolean ) arg2, const Kernel::PassedDyn & dyn ) const
412 return RefCountPtr< const Lang::Value >( new Lang::Boolean( arg1->val_ ^ arg2->val_ ) );