diff options
author | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-20 19:00:19 (GMT) |
---|---|---|
committer | clifford <clifford@b57f626f-c46c-0410-a088-ec61d464b74c> | 2009-06-20 19:00:19 (GMT) |
commit | e416017c5e0ef689e9fbc43b520632cde7927c26 (patch) | |
tree | ff027e61646404db33fde1a4dc245a870fd56722 /func.cc | |
parent | e80db13e335ccef3e93016a84b9aab1883828bda (diff) |
Clifford Wolf:
Added fundamential backend data structures
(it is all still untested)
git-svn-id: http://svn.clifford.at/openscad/trunk@3 b57f626f-c46c-0410-a088-ec61d464b74c
Diffstat (limited to 'func.cc')
-rw-r--r-- | func.cc | 123 |
1 files changed, 123 insertions, 0 deletions
@@ -0,0 +1,123 @@ +/* + * OpenSCAD (www.openscad.at) + * Copyright (C) 2009 Clifford Wolf <clifford@clifford.at> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include "openscad.h" +#include <math.h> + +AbstractFunction::~AbstractFunction() +{ +} + +Value AbstractFunction::evaluate(Context*, const QVector<QString>&, const QVector<Value>&) +{ + return Value(); +} + +Function::~Function() +{ + for (int i=0; i < argexpr.size(); i++) + delete argexpr[i]; +} + +Value Function::evaluate(Context *ctx, const QVector<QString> &call_argnames, const QVector<Value> &call_argvalues) +{ + Context c(ctx); + c.args(argnames, argexpr, call_argnames, call_argvalues); + return expr.evaluate(&c); +} + +QHash<QString, AbstractFunction*> builtin_functions; + +BuiltinFunction::~BuiltinFunction() +{ +} + +Value BuiltinFunction::evaluate(Context*, const QVector<QString>&, const QVector<Value> &call_argvalues) +{ + return eval_func(call_argvalues); +} + +Value builtin_sin(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(sin(args[0].x)); +} + +Value builtin_cos(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(cos(args[0].x)); +} + +Value builtin_asin(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(asin(args[0].x)); +} + +Value builtin_acos(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(acos(args[0].x)); +} + +Value builtin_tan(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(tan(args[0].x)); +} + +Value builtin_atan(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector) + return Value(); + return Value(atan(args[0].x)); +} + +Value builtin_atan2(const QVector<Value> &args) +{ + if (args[0].is_nan || args[0].is_vector || args[1].is_nan || args[1].is_vector) + return Value(); + return Value(atan2(args[0].x, args[1].x)); +} + +void initialize_builtin_functions() +{ + builtin_functions["sin"] = new BuiltinFunction(&builtin_sin); + builtin_functions["cos"] = new BuiltinFunction(&builtin_cos); + builtin_functions["asin"] = new BuiltinFunction(&builtin_asin); + builtin_functions["acos"] = new BuiltinFunction(&builtin_acos); + builtin_functions["tan"] = new BuiltinFunction(&builtin_tan); + builtin_functions["atan"] = new BuiltinFunction(&builtin_atan); + builtin_functions["atan2"] = new BuiltinFunction(&builtin_atan2); +} + +void destroy_builtin_functions() +{ + foreach (AbstractFunction *v, builtin_functions) + delete v; + builtin_functions.clear(); +} + |