Updating the changelog in the VERSION file, and version_sync.
[shapes.git] / source / astexpr_arithmetic.cc
blobf66521179b61081e11fff10daf508866f73700e9
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"
24 #include "globals.h"
26 using namespace Shapes;
27 using namespace std;
30 RefCountPtr< const Lang::Value >
31 Ast::PlusPlusExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
33 if( arg1->val_ < 0 )
35 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
37 if( arg2->val_ < 0 )
39 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
41 return RefCountPtr< const Lang::Value >( new Lang::Float( sqrt( (arg1->val_)*(arg1->val_) + (arg2->val_)*(arg2->val_) ) ) );
44 RefCountPtr< const Lang::Value >
45 Ast::PlusPlusExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
47 Concrete::Length tmp1 = arg1->get( );
48 Concrete::Length tmp2 = arg2->get( );
49 if( tmp1 < 0 )
51 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
53 if( tmp2 < 0 )
55 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Arguments to Pythagorean addition must be positive." ) );
57 return RefCountPtr< const Lang::Value >( new Lang::Length( hypotPhysical( tmp1, tmp2 ) ) );
61 RefCountPtr< const Lang::Value >
62 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
64 if( arg1->val_ < 0 )
66 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
68 if( arg2->val_ < 0 )
70 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
72 if( arg1->val_ < arg2->val_ )
74 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "The first argument bust be greater than the second one in Pythagorean subtraction." ) );
76 return RefCountPtr< const Lang::Value >( new Lang::Float( sqrt( (arg1->val_)*(arg1->val_) - (arg2->val_)*(arg2->val_) ) ) );
79 RefCountPtr< const Lang::Value >
80 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
82 Concrete::Length tmp1 = arg1->get( );
83 Concrete::Length tmp2 = arg2->get( );
84 if( tmp1 < 0 )
86 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
88 if( tmp2 < 0 )
90 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Arguments to Pythagorean subtraction must be positive." ) );
92 if( tmp1 < tmp2 )
94 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "The first argument bust be greater than the second one in Pythagorean subtraction." ) );
96 return RefCountPtr< const Lang::Value >( new Lang::Length( sqrtPhysical( tmp1*tmp1 - tmp2*tmp2 ) ) );
99 RefCountPtr< const Lang::Value >
100 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
102 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
105 RefCountPtr< const Lang::Value >
106 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
108 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
111 RefCountPtr< const Lang::Value >
112 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
114 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
117 RefCountPtr< const Lang::Value >
118 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Path2D ) arg2, const Kernel::PassedDyn & dyn ) const
120 if( arg2->isClosed( ) )
122 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
124 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
127 RefCountPtr< const Lang::Value >
128 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
130 if( arg1->isClosed( ) )
132 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
134 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
137 RefCountPtr< const Lang::Value >
138 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
140 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
143 RefCountPtr< const Lang::Value >
144 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint2D ) arg1, DUMMYANDREF( const Lang::Path2D ) arg2, const Kernel::PassedDyn & dyn ) const
146 if( arg2->isClosed( ) )
148 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
150 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
153 RefCountPtr< const Lang::Value >
154 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D ) arg1, DUMMYANDREF( const Lang::PathPoint2D ) arg2, const Kernel::PassedDyn & dyn ) const
156 if( arg1->isClosed( ) )
158 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
160 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
163 RefCountPtr< const Lang::Value >
164 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path2D ) arg1, DUMMYANDREF( const Lang::Path2D ) arg2, const Kernel::PassedDyn & dyn ) const
166 if( arg1->isClosed( ) )
168 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
170 if( arg2->isClosed( ) )
172 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
174 return Kernel::ValueRef( new Lang::Connection2D( arg1, arg2 ) );
177 RefCountPtr< const Lang::Value >
178 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
180 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ),
181 RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
184 RefCountPtr< const Lang::Value >
185 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::PathPoint3D ) arg2, const Kernel::PassedDyn & dyn ) const
187 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ),
188 RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
191 RefCountPtr< const Lang::Value >
192 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
194 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ),
195 RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
198 RefCountPtr< const Lang::Value >
199 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Path3D ) arg2, const Kernel::PassedDyn & dyn ) const
201 if( arg2->isClosed( ) )
203 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
205 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ), arg2 ) );
208 RefCountPtr< const Lang::Value >
209 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
211 if( arg1->isClosed( ) )
213 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
215 return Kernel::ValueRef( new Lang::Connection3D( arg1, RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
218 RefCountPtr< const Lang::Value >
219 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D ) arg1, DUMMYANDREF( const Lang::PathPoint3D ) arg2, const Kernel::PassedDyn & dyn ) const
221 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ),
222 RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
225 RefCountPtr< const Lang::Value >
226 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathPoint3D ) arg1, DUMMYANDREF( const Lang::Path3D ) arg2, const Kernel::PassedDyn & dyn ) const
228 if( arg2->isClosed( ) )
230 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
232 return Kernel::ValueRef( new Lang::Connection3D( RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg1 ) ), arg2 ) );
235 RefCountPtr< const Lang::Value >
236 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D ) arg1, DUMMYANDREF( const Lang::PathPoint3D ) arg2, const Kernel::PassedDyn & dyn ) const
238 if( arg1->isClosed( ) )
240 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
242 return Kernel::ValueRef( new Lang::Connection3D( arg1, RefCountPtr< Lang::Path3D >( new Lang::SinglePointPath3D( arg2 ) ) ) );
245 RefCountPtr< const Lang::Value >
246 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::Path3D ) arg1, DUMMYANDREF( const Lang::Path3D ) arg2, const Kernel::PassedDyn & dyn ) const
248 if( arg1->isClosed( ) )
250 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
252 if( arg2->isClosed( ) )
254 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Closed subpaths cannot be connected with." ) );
256 return Kernel::ValueRef( new Lang::Connection3D( arg1, arg2 ) );
259 RefCountPtr< const Lang::Value >
260 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::PathSlider2D ) arg2, const Kernel::PassedDyn & dyn ) const
262 RefCountPtr< const Lang::ElementaryPath2D > path = arg1->getPath( );
263 if( path != arg2->getPath( ) )
265 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Cannot connect sliders that belong to different paths." ) );
268 if( arg1->getFront( ) != NullPtr< const Lang::Value >( ) )
270 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "When connecting sliders, the rear slider cannot have a front handle." ) );
272 if( arg2->getRear( ) != NullPtr< const Lang::Value >( ) )
274 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "When connecting sliders, the front slider cannot have a rear handle." ) );
277 if( arg1->getRear( ) == NullPtr< const Lang::Value >( ) &&
278 arg2->getFront( ) == NullPtr< const Lang::Value >( ) )
280 return path->subpath( arg1->getTime( ), arg2->getTime( ) );
283 return Kernel::ValueRef( new Lang::HeadedPath2D( arg1->getRear( ), path->subpath( arg1->getTime( ), arg2->getTime( ) ), arg2->getFront( ) ) );
286 RefCountPtr< const Lang::Value >
287 Ast::MinusMinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::PathSlider3D ) arg2, const Kernel::PassedDyn & dyn ) const
289 RefCountPtr< const Lang::ElementaryPath3D > path = arg1->getPath( );
290 if( path != arg2->getPath( ) )
292 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Cannot connect sliders that belong to different paths." ) );
295 if( arg1->getFront( ) != NullPtr< const Lang::Value >( ) )
297 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "When connecting sliders, the rear slider cannot have a front handle." ) );
299 if( arg2->getRear( ) != NullPtr< const Lang::Value >( ) )
301 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "When connecting sliders, the front slider cannot have a rear handle." ) );
304 if( arg1->getRear( ) == NullPtr< const Lang::Value >( ) &&
305 arg2->getFront( ) == NullPtr< const Lang::Value >( ) )
307 return path->subpath( arg1->getTime( ), arg2->getTime( ) );
310 return Kernel::ValueRef( new Lang::HeadedPath3D( arg1->getRear( ), path->subpath( arg1->getTime( ), arg2->getTime( ) ), arg2->getFront( ) ) );
315 RefCountPtr< const Lang::Value >
316 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path2D ) arg1, DUMMYANDREF( const Lang::Path2D ) arg2, const Kernel::PassedDyn & dyn ) const
318 Lang::MultiPath2D * res = new Lang::MultiPath2D;
319 res->push_back( arg1 );
320 res->push_back( arg2 );
321 return RefCountPtr< Lang::Value >( res );
324 RefCountPtr< const Lang::Value >
325 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath2D ) arg1, DUMMYANDREF( const Lang::Path2D ) arg2, const Kernel::PassedDyn & dyn ) const
327 Lang::MultiPath2D * res = arg1->clone( );
328 res->push_back( arg2 );
329 return RefCountPtr< Lang::Value >( res );
332 RefCountPtr< const Lang::Value >
333 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path2D ) arg1, DUMMYANDREF( const Lang::MultiPath2D ) arg2, const Kernel::PassedDyn & dyn ) const
335 Lang::MultiPath2D * res = arg2->clone( );
336 res->push_front( arg1 );
337 return RefCountPtr< Lang::Value >( res );
340 RefCountPtr< const Lang::Value >
341 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath2D ) arg1, DUMMYANDREF( const Lang::MultiPath2D ) arg2, const Kernel::PassedDyn & dyn ) const
343 Lang::MultiPath2D * res = arg1->clone( );
344 typedef typeof( *arg2 ) ListType;
345 for( ListType::const_iterator i = arg2->begin( ); i != arg2->end( ); ++i )
347 res->push_back( *i );
349 return RefCountPtr< Lang::Value >( res );
352 RefCountPtr< const Lang::Value >
353 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path3D ) arg1, DUMMYANDREF( const Lang::Path3D ) arg2, const Kernel::PassedDyn & dyn ) const
355 Lang::MultiPath3D * res = new Lang::MultiPath3D;
356 res->push_back( arg1 );
357 res->push_back( arg2 );
358 return RefCountPtr< Lang::Value >( res );
361 RefCountPtr< const Lang::Value >
362 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath3D ) arg1, DUMMYANDREF( const Lang::Path3D ) arg2, const Kernel::PassedDyn & dyn ) const
364 Lang::MultiPath3D * res = arg1->clone( );
365 res->push_back( arg2 );
366 return RefCountPtr< Lang::Value >( res );
369 RefCountPtr< const Lang::Value >
370 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Path3D ) arg1, DUMMYANDREF( const Lang::MultiPath3D ) arg2, const Kernel::PassedDyn & dyn ) const
372 Lang::MultiPath3D * res = arg2->clone( );
373 res->push_front( arg1 );
374 return RefCountPtr< Lang::Value >( res );
377 RefCountPtr< const Lang::Value >
378 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::MultiPath3D ) arg1, DUMMYANDREF( const Lang::MultiPath3D ) arg2, const Kernel::PassedDyn & dyn ) const
380 Lang::MultiPath3D * res = arg1->clone( );
381 typedef typeof( *arg2 ) ListType;
382 for( ListType::const_iterator i = arg2->begin( ); i != arg2->end( ); ++i )
384 res->push_back( *i );
386 return RefCountPtr< Lang::Value >( res );
389 RefCountPtr< const Lang::Value >
390 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::DynamicBindings ) arg1, DUMMYANDREF( const Lang::DynamicBindings ) arg2, const Kernel::PassedDyn & dyn ) const
392 if( arg1 == Lang::THE_NULL_DYNAMIC_BINDINGS )
394 return arg2;
396 if( arg2 == Lang::THE_NULL_DYNAMIC_BINDINGS )
398 return arg1;
400 return RefCountPtr< Lang::DynamicBindings >( new Lang::DynamicBindingsPair( arg1, arg2 ) );
403 RefCountPtr< const Lang::Value >
404 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Drawable2D ) arg1, DUMMYANDREF( const Lang::Drawable2D ) arg2, const Kernel::PassedDyn & dyn ) const
406 RefCountPtr< const Kernel::GraphicsState > metaState = dyn->getGraphicsState( );
407 return RefCountPtr< Lang::Group2D >( new Lang::GroupPair2D
408 ( arg2,
409 RefCountPtr< Lang::Group2D >( new Lang::GroupPair2D
410 ( arg1,
411 Lang::THE_NULL2D,
412 metaState ) ),
413 metaState ) );
416 RefCountPtr< const Lang::Value >
417 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Group2D ) arg1, DUMMYANDREF( const Lang::Drawable2D ) arg2, const Kernel::PassedDyn & dyn ) const
419 return RefCountPtr< Lang::Group2D >( new Lang::GroupPair2D( arg2, arg1, dyn->getGraphicsState( ) ) );
422 RefCountPtr< const Lang::Value >
423 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Drawable3D ) arg1, DUMMYANDREF( const Lang::Drawable3D ) arg2, const Kernel::PassedDyn & dyn ) const
425 RefCountPtr< const Kernel::GraphicsState > metaState = dyn->getGraphicsState( );
426 return RefCountPtr< Lang::Group3D >( new Lang::GroupPair3D
427 ( arg2,
428 RefCountPtr< Lang::Group3D >( new Lang::GroupPair3D
429 ( arg1,
430 Lang::THE_NULL3D,
431 metaState ) ),
432 metaState ) );
435 RefCountPtr< const Lang::Value >
436 Ast::AmpersandExpr::impl( DUMMYANDREF( const Lang::Group3D ) arg1, DUMMYANDREF( const Lang::Drawable3D ) arg2, const Kernel::PassedDyn & dyn ) const
438 return RefCountPtr< Lang::Group3D >( new Lang::GroupPair3D( arg2, arg1, dyn->getGraphicsState( ) ) );
442 RefCountPtr< const Lang::Value >
443 Ast::AmpersandMoreExpr::impl( DUMMYANDREF( const Lang::DynamicBindings ) arg1, DUMMYANDREF( const Lang::DynamicBindings ) arg2, const Kernel::PassedDyn & dyn ) const
445 if( arg1 == Lang::THE_NULL_DYNAMIC_BINDINGS )
447 return arg2;
449 if( arg2 == Lang::THE_NULL_DYNAMIC_BINDINGS )
451 return arg1;
453 return RefCountPtr< Lang::DynamicBindings >( new Lang::DynamicBindingsPair( arg1, arg2, true ) ); /* True means "second overrides first" */
457 RefCountPtr< const Lang::Value >
458 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
460 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ + arg2->val_ ) );
463 RefCountPtr< const Lang::Value >
464 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
466 return RefCountPtr< const Lang::Value >( new Lang::Integer( arg1->val_ + arg2->val_ ) );
469 RefCountPtr< const Lang::Value >
470 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
472 return RefCountPtr< const Lang::Value >( new Lang::Length( *arg1 + *arg2 ) );
475 RefCountPtr< const Lang::Value >
476 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
478 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->x_ + arg2->x_, arg1->y_ + arg2->y_ ) );
481 RefCountPtr< const Lang::Value >
482 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
484 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->x_ + arg2->x_, arg1->y_ + arg2->y_ ) );
487 RefCountPtr< const Lang::Value >
488 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
490 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->x_ + arg2->x_, arg1->y_ + arg2->y_, arg1->z_ + arg2->z_ ) );
493 RefCountPtr< const Lang::Value >
494 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
496 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->x_ + arg2->x_, arg1->y_ + arg2->y_, arg1->z_ + arg2->z_ ) );
499 RefCountPtr< const Lang::Value >
500 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::String ) arg1, DUMMYANDREF( const Lang::String ) arg2, const Kernel::PassedDyn & dyn ) const
502 const char * src1 = arg1->val_.getPtr( );
503 const char * src2 = arg2->val_.getPtr( );
504 int l1 = strlen( src1 );
505 char * mem = new char[ l1 + strlen( src2 ) + 1 ];
506 strcpy( mem, src1 );
507 strcpy( mem + l1, src2 );
508 return RefCountPtr< const Lang::Value >( new Lang::String( mem, false ) );
511 RefCountPtr< const Lang::Value >
512 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Dash ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
514 return arg1->shifted( arg2->get( ) );
517 RefCountPtr< const Lang::Value >
518 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Dash ) arg2, const Kernel::PassedDyn & dyn ) const
520 return arg2->shifted( arg1->get( ) );
523 RefCountPtr< const Lang::Value >
524 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
526 return arg1->move_time( Concrete::Time( arg2->val_ ) );
529 RefCountPtr< const Lang::Value >
530 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
532 return arg1->move_length( arg2->get( ) );
535 RefCountPtr< const Lang::Value >
536 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
538 return arg1->move_time( Concrete::Time( arg2->val_ ) );
541 RefCountPtr< const Lang::Value >
542 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
544 return arg1->move_length( arg2->get( ) );
547 RefCountPtr< const Lang::Value >
548 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::RGB ) arg1, DUMMYANDREF( const Lang::RGB ) arg2, const Kernel::PassedDyn & dyn ) const
550 return RefCountPtr< const Lang::Value >( new Lang::RGB( arg1->components( ).add( arg2->components( ), loc( ) ) ) );
553 RefCountPtr< const Lang::Value >
554 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::Gray ) arg1, DUMMYANDREF( const Lang::Gray ) arg2, const Kernel::PassedDyn & dyn ) const
556 return RefCountPtr< const Lang::Value >( new Lang::Gray( arg1->components( ).add( arg2->components( ), loc( ) ) ) );
559 RefCountPtr< const Lang::Value >
560 Ast::PlusExpr::impl( DUMMYANDREF( const Lang::SpecularReflection ) arg1, DUMMYANDREF( const Lang::SpecularReflection ) arg2, const Kernel::PassedDyn & dyn ) const
562 return RefCountPtr< const Lang::Value >( new Lang::SpecularReflectionPair( arg1, arg2 ) );
566 RefCountPtr< const Lang::Value >
567 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
569 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ - arg2->val_ ) );
572 RefCountPtr< const Lang::Value >
573 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
575 return RefCountPtr< const Lang::Value >( new Lang::Integer( arg1->val_ - arg2->val_ ) );
578 RefCountPtr< const Lang::Value >
579 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
581 return RefCountPtr< const Lang::Value >( new Lang::Length( *arg1 - *arg2 ) );
584 RefCountPtr< const Lang::Value >
585 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
587 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->x_ - arg2->x_, arg1->y_ - arg2->y_ ) );
590 RefCountPtr< const Lang::Value >
591 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
593 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->x_ - arg2->x_, arg1->y_ - arg2->y_ ) );
596 RefCountPtr< const Lang::Value >
597 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
599 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->x_ - arg2->x_, arg1->y_ - arg2->y_, arg1->z_ - arg2->z_ ) );
602 RefCountPtr< const Lang::Value >
603 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
605 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->x_ - arg2->x_, arg1->y_ - arg2->y_, arg1->z_ - arg2->z_ ) );
608 RefCountPtr< const Lang::Value >
609 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
611 return arg1->move_time( Concrete::Time( - arg2->val_ ) );
614 RefCountPtr< const Lang::Value >
615 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider2D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
617 return arg1->move_length( - arg2->get( ) );
620 RefCountPtr< const Lang::Value >
621 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
623 return arg1->move_time( Concrete::Time( - arg2->val_ ) );
626 RefCountPtr< const Lang::Value >
627 Ast::MinusExpr::impl( DUMMYANDREF( const Lang::PathSlider3D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
629 return arg1->move_length( - arg2->get( ) );
633 RefCountPtr< const Lang::Value >
634 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
636 double tmp = arg1->val_ * arg2->val_;
637 if( tmp > 0 )
639 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
641 if( tmp < 0 )
643 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI ) );
645 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
648 RefCountPtr< const Lang::Value >
649 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
651 Concrete::Length tmp = arg1->val_ * arg2->get( );
652 if( tmp > 0 )
654 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
656 if( tmp < 0 )
658 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI ) );
660 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
663 RefCountPtr< const Lang::Value >
664 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
666 Concrete::Length tmp = arg1->get( ) * arg2->val_;
667 if( tmp > 0 )
669 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
671 if( tmp < 0 )
673 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI ) );
675 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
678 RefCountPtr< const Lang::Value >
679 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
681 Concrete::LengthSquared tmp = arg1->get( ) * arg2->get( );
682 if( tmp > 0 )
684 return RefCountPtr< const Lang::Value >( new Lang::Float( 0 ) );
686 if( tmp < 0 )
688 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI ) );
690 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
693 RefCountPtr< const Lang::Value >
694 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
696 const double x1 = arg1->x_;
697 const double y1 = arg1->y_;
698 const double x2 = arg2->x_;
699 const double y2 = arg2->y_;
700 double norm1 = hypot( x1, y1 );
701 double norm2 = hypot( x2, y2 );
702 if( norm1 == 0 || norm2 == 0 )
704 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
706 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) ) ) ) );
709 RefCountPtr< const Lang::Value >
710 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
712 const double x1 = arg1->x_;
713 const double y1 = arg1->y_;
714 const Concrete::Length x2 = arg2->x_.get( );
715 const Concrete::Length y2 = arg2->y_.get( );
716 double norm1 = hypot( x1, y1 );
717 Concrete::Length norm2 = hypotPhysical( x2, y2 );
718 if( norm1 == 0 || norm2 == 0 )
720 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
722 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) ) ) ) );
725 RefCountPtr< const Lang::Value >
726 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
728 const Concrete::Length x1 = arg1->x_.get( );
729 const Concrete::Length y1 = arg1->y_.get( );
730 const double x2 = arg2->x_;
731 const double y2 = arg2->y_;
732 Concrete::Length norm1 = hypotPhysical( x1, y1 );
733 double norm2 = hypot( x2, y2 );
734 if( norm1 == 0 || norm2 == 0 )
736 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
738 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) ) ) ) );
741 RefCountPtr< const Lang::Value >
742 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
744 const Concrete::Length x1 = arg1->x_.get( );
745 const Concrete::Length y1 = arg1->y_.get( );
746 const Concrete::Length x2 = arg2->x_.get( );
747 const Concrete::Length y2 = arg2->y_.get( );
748 Concrete::Length norm1 = hypotPhysical( x1, y1 );
749 Concrete::Length norm2 = hypotPhysical( x2, y2 );
750 if( norm1 == 0 || norm2 == 0 )
752 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
754 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) ) ) ) );
757 RefCountPtr< const Lang::Value >
758 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
760 const double x1 = arg1->x_;
761 const double y1 = arg1->y_;
762 const double z1 = arg1->z_;
763 const double x2 = arg2->x_;
764 const double y2 = arg2->y_;
765 const double z2 = arg2->z_;
766 double norm1 = Concrete::Scalar::hypot3( x1, y1, z1 );
767 double norm2 = Concrete::Scalar::hypot3( x2, y2, z2 );
768 if( norm1 == 0 || norm2 == 0 )
770 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
772 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) + (z1/norm1) * (z2/norm2) ) ) ) );
775 RefCountPtr< const Lang::Value >
776 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
778 const double x1 = arg1->x_;
779 const double y1 = arg1->y_;
780 const double z1 = arg1->z_;
781 const Concrete::Length x2 = arg2->x_.get( );
782 const Concrete::Length y2 = arg2->y_.get( );
783 const Concrete::Length z2 = arg2->z_.get( );
784 double norm1 = Concrete::Scalar::hypot3( x1, y1, z1 );
785 Concrete::Length norm2 = hypotPhysical( x2, y2, z2 );
786 if( norm1 == 0 || norm2 == 0 )
788 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
790 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) + (z1/norm1) * (z2/norm2) ) ) ) );
793 RefCountPtr< const Lang::Value >
794 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
796 const Concrete::Length x1 = arg1->x_.get( );
797 const Concrete::Length y1 = arg1->y_.get( );
798 const Concrete::Length z1 = arg1->z_.get( );
799 const double x2 = arg2->x_;
800 const double y2 = arg2->y_;
801 const double z2 = arg2->z_;
802 Concrete::Length norm1 = hypotPhysical( x1, y1, z1 );
803 double norm2 = Concrete::Scalar::hypot3( x2, y2, z2 );
804 if( norm1 == 0 || norm2 == 0 )
806 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
808 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) + (z1/norm1) * (z2/norm2) ) ) ) );
811 RefCountPtr< const Lang::Value >
812 Ast::AngleExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
814 const Concrete::Length x1 = arg1->x_.get( );
815 const Concrete::Length y1 = arg1->y_.get( );
816 const Concrete::Length z1 = arg1->z_.get( );
817 const Concrete::Length x2 = arg2->x_.get( );
818 const Concrete::Length y2 = arg2->y_.get( );
819 const Concrete::Length z2 = arg2->z_.get( );
820 Concrete::Length norm1 = hypotPhysical( x1, y1, z1 );
821 Concrete::Length norm2 = hypotPhysical( x2, y2, z2 );
822 if( norm1 == 0 || norm2 == 0 )
824 return RefCountPtr< const Lang::Value >( new Lang::Float( M_PI_2 ) );
826 return RefCountPtr< const Lang::Value >( new Lang::Float( acos( ( (x1/norm1) * (x2/norm2) + (y1/norm1) * (y2/norm2) + (z1/norm1) * (z2/norm2) ) ) ) );
830 RefCountPtr< const Lang::Value >
831 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
833 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ * arg2->val_ ) );
836 RefCountPtr< const Lang::Value >
837 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
839 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->x_ * arg2->x_ + arg1->y_ * arg2->y_ ) );
842 RefCountPtr< const Lang::Value >
843 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
845 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->x_ * arg2->val_, arg1->y_ * arg2->val_ ) );
848 RefCountPtr< const Lang::Value >
849 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
851 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->val_ * arg2->x_, arg1->val_ * arg2->y_ ) );
854 RefCountPtr< const Lang::Value >
855 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
857 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->x_ * arg2->x_ + arg1->y_ * arg2->y_ + arg1->z_ * arg2->z_ ) );
860 RefCountPtr< const Lang::Value >
861 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
863 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->x_ * arg2->val_, arg1->y_ * arg2->val_, arg1->z_ * arg2->val_ ) );
866 RefCountPtr< const Lang::Value >
867 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
869 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->val_ * arg2->x_, arg1->val_ * arg2->y_, arg1->val_ * arg2->z_ ) );
872 RefCountPtr< const Lang::Value >
873 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
875 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->get( ) * arg2->val_ ) );
878 RefCountPtr< const Lang::Value >
879 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
881 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->val_ * arg2->get( ) ) );
884 RefCountPtr< const Lang::Value >
885 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
887 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->x_.get( ) * arg2->val_, arg1->y_.get( ) * arg2->val_ ) );
890 RefCountPtr< const Lang::Value >
891 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
893 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->val_ * arg2->x_.get( ), arg1->val_ * arg2->y_.get( ) ) );
896 RefCountPtr< const Lang::Value >
897 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
899 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->x_.get( ) * arg2->x_ + arg1->y_.get( ) * arg2->y_ ) );
902 RefCountPtr< const Lang::Value >
903 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
905 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->x_ * arg2->x_.get( ) + arg1->y_ * arg2->y_.get( ) ) );
908 RefCountPtr< const Lang::Value >
909 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
911 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->x_ * arg2->get( ), arg1->y_ * arg2->get( ) ) );
914 RefCountPtr< const Lang::Value >
915 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
917 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->get( ) * arg2->x_, arg1->get( ) * arg2->y_ ) );
920 RefCountPtr< const Lang::Value >
921 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
923 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->x_.get( ) * arg2->val_, arg1->y_.get( ) * arg2->val_, arg1->z_.get( ) * arg2->val_ ) );
926 RefCountPtr< const Lang::Value >
927 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
929 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->val_ * arg2->x_.get( ), arg1->val_ * arg2->y_.get( ), arg1->val_ * arg2->z_.get( ) ) );
932 RefCountPtr< const Lang::Value >
933 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
935 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->x_.get( ) * arg2->x_ + arg1->y_.get( ) * arg2->y_ + arg1->z_.get( ) * arg2->z_ ) );
938 RefCountPtr< const Lang::Value >
939 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
941 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->x_ * arg2->x_.get( ) + arg1->y_ * arg2->y_.get( ) + arg1->z_ * arg2->z_.get( ) ) );
944 RefCountPtr< const Lang::Value >
945 Ast::StarExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
947 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->x_ * arg2->get( ), arg1->y_ * arg2->get( ), arg1->z_ * arg2->get( ) ) );
950 RefCountPtr< const Lang::Value >
951 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
953 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->get( ) * arg2->x_, arg1->get( ) * arg2->y_, arg1->get( ) * arg2->z_ ) );
956 RefCountPtr< const Lang::Value >
957 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Dash ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
959 if( arg2->val_ <= 0 )
961 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
964 return arg1->scaled( arg2->val_ );
967 RefCountPtr< const Lang::Value >
968 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Dash ) arg2, const Kernel::PassedDyn & dyn ) const
970 if( arg1->val_ <= 0 )
972 throw Exceptions::OutOfRange( this->loc( ), strrefdup( "Dashpatterns can only be scaled by positive values" ) );
975 return arg2->scaled( arg1->val_ );
978 RefCountPtr< const Lang::Value >
979 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform2D ) arg1, DUMMYANDREF( const Lang::Transform2D ) arg2, const Kernel::PassedDyn & dyn ) const
981 return RefCountPtr< const Lang::Value >( new Lang::Transform2D( *arg1, *arg2 ) );
984 RefCountPtr< const Lang::Value >
985 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Transform3D ) arg1, DUMMYANDREF( const Lang::Transform3D ) arg2, const Kernel::PassedDyn & dyn ) const
987 return RefCountPtr< const Lang::Value >( new Lang::Transform3D( *arg1, *arg2 ) );
990 RefCountPtr< const Lang::Value >
991 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::RGB ) arg2, const Kernel::PassedDyn & dyn ) const
993 return RefCountPtr< const Lang::Value >( new Lang::RGB( arg2->components( ).mul( arg1->val_, expr1_->loc( ) ) ) );
996 RefCountPtr< const Lang::Value >
997 Ast::StarExpr::impl( DUMMYANDREF( const Lang::RGB ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
999 return RefCountPtr< const Lang::Value >( new Lang::RGB( arg1->components( ).mul( arg2->val_, expr1_->loc( ) ) ) );
1002 RefCountPtr< const Lang::Value >
1003 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Gray ) arg2, const Kernel::PassedDyn & dyn ) const
1005 return RefCountPtr< const Lang::Value >( new Lang::Gray( arg2->components( ).mul( arg1->val_, expr1_->loc( ) ) ) );
1008 RefCountPtr< const Lang::Value >
1009 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Gray ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1011 return RefCountPtr< const Lang::Value >( new Lang::Gray( arg1->components( ).mul( arg2->val_, expr1_->loc( ) ) ) );
1014 RefCountPtr< const Lang::Value >
1015 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::SpecularReflection ) arg2, const Kernel::PassedDyn & dyn ) const
1017 double scalar = arg1->val_;
1018 if( scalar < 0 || scalar > 1 )
1020 throw Exceptions::OutOfRange( expr1_->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1022 return arg2->multiply( scalar );
1025 RefCountPtr< const Lang::Value >
1026 Ast::StarExpr::impl( DUMMYANDREF( const Lang::SpecularReflection ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1028 double scalar = arg2->val_;
1029 if( scalar < 0 || scalar > 1 )
1031 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "The scalar must be in the interval [ 0, 1 ]." ) );
1033 return arg1->multiply( scalar );
1036 RefCountPtr< const Lang::Value >
1037 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1039 return RefCountPtr< const Lang::Value >( new Lang::Integer( arg1->val_ * arg2->val_ ) );
1042 RefCountPtr< const Lang::Value >
1043 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1045 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ * arg2->val_ ) );
1048 RefCountPtr< const Lang::Value >
1049 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1051 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ * arg2->val_ ) );
1054 RefCountPtr< const Lang::Value >
1055 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1057 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->get( ) * arg2->val_ ) );
1060 RefCountPtr< const Lang::Value >
1061 Ast::StarExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
1063 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->val_ * arg2->get( ) ) );
1067 RefCountPtr< const Lang::Value >
1068 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
1070 const double x1 = arg1->x_;
1071 const double y1 = arg1->y_;
1072 const double x2 = arg2->x_;
1073 const double y2 = arg2->y_;
1074 double norm2_2 = x2 * x2 + y2 * y2;
1075 if( norm2_2 == 0 )
1077 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1079 double s = ( x1 * x2 + y1 * y2 ) / norm2_2;
1080 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( s * x2, s * y2 ) );
1083 RefCountPtr< const Lang::Value >
1084 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
1086 const double x1 = arg1->x_;
1087 const double y1 = arg1->y_;
1088 const Concrete::Length x2 = arg2->x_.get( );
1089 const Concrete::Length y2 = arg2->y_.get( );
1090 Concrete::LengthSquared norm2_2 = x2 * x2 + y2 * y2;
1091 if( norm2_2 == 0 )
1093 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1095 Physical< -1, 0 > s = ( x1 * x2 + y1 * y2 ) / norm2_2;
1096 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( s * x2, s * y2 ) );
1099 RefCountPtr< const Lang::Value >
1100 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::FloatPair ) arg2, const Kernel::PassedDyn & dyn ) const
1102 const Concrete::Length x1 = arg1->x_.get( );
1103 const Concrete::Length y1 = arg1->y_.get( );
1104 const double x2 = arg2->x_;
1105 const double y2 = arg2->y_;
1106 const double norm2_2 = x2 * x2 + y2 * y2;
1107 if( norm2_2 == 0 )
1109 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1111 Concrete::Length s = ( x1 * x2 + y1 * y2 ) / norm2_2;
1112 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( s * x2, s * y2 ) );
1115 RefCountPtr< const Lang::Value >
1116 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Coords2D ) arg2, const Kernel::PassedDyn & dyn ) const
1118 const Concrete::Length x1 = arg1->x_.get( );
1119 const Concrete::Length y1 = arg1->y_.get( );
1120 const Concrete::Length x2 = arg2->x_.get( );
1121 const Concrete::Length y2 = arg2->y_.get( );
1122 Concrete::LengthSquared norm2_2 = x2 * x2 + y2 * y2;
1123 if( norm2_2 == 0 )
1125 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1127 double s = ( x1 * x2 + y1 * y2 ) / norm2_2;
1128 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( s * x2, s * y2 ) );
1131 RefCountPtr< const Lang::Value >
1132 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
1134 const double x1 = arg1->x_;
1135 const double y1 = arg1->y_;
1136 const double z1 = arg1->z_;
1137 const double x2 = arg2->x_;
1138 const double y2 = arg2->y_;
1139 const double z2 = arg2->z_;
1140 double norm2_2 = x2 * x2 + y2 * y2 + z2 * z2;
1141 if( norm2_2 == 0 )
1143 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1145 double s = ( x1 * x2 + y1 * y2 + z1 * z2 ) / norm2_2;
1146 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( s * x2, s * y2, s * z2 ) );
1149 RefCountPtr< const Lang::Value >
1150 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
1152 const double x1 = arg1->x_;
1153 const double y1 = arg1->y_;
1154 const double z1 = arg1->z_;
1155 const Concrete::Length x2 = arg2->x_.get( );
1156 const Concrete::Length y2 = arg2->y_.get( );
1157 const Concrete::Length z2 = arg2->z_.get( );
1158 Concrete::LengthSquared norm2_2 = x2 * x2 + y2 * y2 + z2 * z2;
1159 if( norm2_2 == 0 )
1161 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1163 Physical< -1, 0 > s = ( x1 * x2 + y1 * y2 + z1 * z2 ) / norm2_2;
1164 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( s * x2, s * y2, s * z2 ) );
1167 RefCountPtr< const Lang::Value >
1168 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::FloatTriple ) arg2, const Kernel::PassedDyn & dyn ) const
1170 const Concrete::Length x1 = arg1->x_.get( );
1171 const Concrete::Length y1 = arg1->y_.get( );
1172 const Concrete::Length z1 = arg1->z_.get( );
1173 const double x2 = arg2->x_;
1174 const double y2 = arg2->y_;
1175 const double z2 = arg2->z_;
1176 const double norm2_2 = x2 * x2 + y2 * y2 + z2 * z2;
1177 if( norm2_2 == 0 )
1179 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1181 Concrete::Length s = ( x1 * x2 + y1 * y2 + z1 * z2 ) / norm2_2;
1182 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( s * x2, s * y2, s * z2 ) );
1185 RefCountPtr< const Lang::Value >
1186 Ast::ProjectionExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Coords3D ) arg2, const Kernel::PassedDyn & dyn ) const
1188 const Concrete::Length x1 = arg1->x_.get( );
1189 const Concrete::Length y1 = arg1->y_.get( );
1190 const Concrete::Length z1 = arg1->z_.get( );
1191 const Concrete::Length x2 = arg2->x_.get( );
1192 const Concrete::Length y2 = arg2->y_.get( );
1193 const Concrete::Length z2 = arg2->z_.get( );
1194 Concrete::LengthSquared norm2_2 = x2 * x2 + y2 * y2 + z2 * z2;
1195 if( norm2_2 == 0 )
1197 throw Exceptions::OutOfRange( expr2_->loc( ), strrefdup( "Projection on zero length vector." ) );
1199 double s = ( x1 * x2 + y1 * y2 + z1 * z2 ) / norm2_2;
1200 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( s * x2, s * y2, s * z2 ) );
1204 RefCountPtr< const Lang::Value >
1205 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1207 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ / arg2->val_ ) );
1210 RefCountPtr< const Lang::Value >
1211 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
1213 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->get( ) / arg2->get( ) ) );
1216 RefCountPtr< const Lang::Value >
1217 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1219 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->get( ) / arg2->val_ ) );
1222 RefCountPtr< const Lang::Value >
1223 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatPair ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1225 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->x_ / arg2->val_, arg1->y_ / arg2->val_ ) );
1228 RefCountPtr< const Lang::Value >
1229 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1231 return RefCountPtr< const Lang::Value >( new Lang::Coords2D( arg1->x_.get( ) / arg2->val_, arg1->y_.get( ) / arg2->val_ ) );
1234 RefCountPtr< const Lang::Value >
1235 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords2D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
1237 return RefCountPtr< const Lang::Value >( new Lang::FloatPair( arg1->x_.get( ) / arg2->get( ), arg1->y_.get( ) / arg2->get( ) ) );
1240 RefCountPtr< const Lang::Value >
1241 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::FloatTriple ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1243 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->x_ / arg2->val_, arg1->y_ / arg2->val_, arg1->z_ / arg2->val_ ) );
1246 RefCountPtr< const Lang::Value >
1247 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Float ) arg2, const Kernel::PassedDyn & dyn ) const
1249 return RefCountPtr< const Lang::Value >( new Lang::Coords3D( arg1->x_.get( ) / arg2->val_, arg1->y_.get( ) / arg2->val_, arg1->z_.get( ) / arg2->val_ ) );
1252 RefCountPtr< const Lang::Value >
1253 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Coords3D ) arg1, DUMMYANDREF( const Lang::Length ) arg2, const Kernel::PassedDyn & dyn ) const
1255 return RefCountPtr< const Lang::Value >( new Lang::FloatTriple( arg1->x_.get( ) / arg2->get( ), arg1->y_.get( ) / arg2->get( ), arg1->z_.get( ) / arg2->get( ) ) );
1258 RefCountPtr< const Lang::Value >
1259 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Integer ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1261 return RefCountPtr< const Lang::Value >( new Lang::Integer( arg1->val_ / arg2->val_ ) );
1264 RefCountPtr< const Lang::Value >
1265 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Float ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1267 return RefCountPtr< const Lang::Value >( new Lang::Float( arg1->val_ / arg2->val_ ) );
1270 RefCountPtr< const Lang::Value >
1271 Ast::SlashExpr::impl( DUMMYANDREF( const Lang::Length ) arg1, DUMMYANDREF( const Lang::Integer ) arg2, const Kernel::PassedDyn & dyn ) const
1273 return RefCountPtr< const Lang::Value >( new Lang::Length( arg1->get( ) / static_cast< double >( arg2->val_ ) ) );
1277 RefCountPtr< const Lang::Value >
1278 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform2D ) arg1, DUMMYANDREF( const Lang::Transform2D ) arg2, const Kernel::PassedDyn & dyn ) const
1280 return RefCountPtr< const Lang::Value >( new Lang::Transform2D( *arg1, *arg2 ) );
1283 RefCountPtr< const Lang::Value >
1284 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Transform3D ) arg1, DUMMYANDREF( const Lang::Transform3D ) arg2, const Kernel::PassedDyn & dyn ) const
1286 return RefCountPtr< const Lang::Value >( new Lang::Transform3D( *arg1, *arg2 ) );
1289 RefCountPtr< const Lang::Value >
1290 Ast::ComposeExpr::impl( DUMMYANDREF( const Lang::Function ) arg1, DUMMYANDREF( const Lang::Function ) arg2, const Kernel::PassedDyn & dyn ) const
1292 return RefCountPtr< const Lang::Value >( new Lang::ComposedFunction( arg1, arg2 ) );