00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "functions.h"
00025 #include "valuecalc.h"
00026 #include "valueconverter.h"
00027
00028 using namespace KSpread;
00029
00030
00031 Value func_and (valVector args, ValueCalc *calc, FuncExtra *);
00032 Value func_false (valVector args, ValueCalc *calc, FuncExtra *);
00033 Value func_if (valVector args, ValueCalc *calc, FuncExtra *);
00034 Value func_nand (valVector args, ValueCalc *calc, FuncExtra *);
00035 Value func_nor (valVector args, ValueCalc *calc, FuncExtra *);
00036 Value func_not (valVector args, ValueCalc *calc, FuncExtra *);
00037 Value func_or (valVector args, ValueCalc *calc, FuncExtra *);
00038 Value func_true (valVector args, ValueCalc *calc, FuncExtra *);
00039 Value func_xor (valVector args, ValueCalc *calc, FuncExtra *);
00040
00041
00042 void RegisterLogicFunctions()
00043 {
00044 FunctionRepository* repo = FunctionRepository::self();
00045 Function *f;
00046
00047 f = new Function ("FALSE", func_false);
00048 f->setParamCount (0);
00049 repo->add (f);
00050 f = new Function ("TRUE", func_true);
00051 f->setParamCount (0);
00052 repo->add (f);
00053 f = new Function ("NOT", func_not);
00054 f->setParamCount (1);
00055 repo->add (f);
00056 f = new Function ("AND", func_and);
00057 f->setParamCount (2, -1);
00058 repo->add (f);
00059 f = new Function ("NAND", func_nand);
00060 f->setParamCount (2, -1);
00061 repo->add (f);
00062 f = new Function ("NOR", func_nor);
00063 f->setParamCount (2, -1);
00064 repo->add (f);
00065 f = new Function ("OR", func_or);
00066 f->setParamCount (2, -1);
00067 repo->add (f);
00068 f = new Function ("XOR", func_xor);
00069 f->setParamCount (2, -1);
00070 repo->add (f);
00071 f = new Function ("IF", func_if);
00072 f->setParamCount (3);
00073 repo->add (f);
00074 }
00075
00076
00077 Value func_false (valVector, ValueCalc *, FuncExtra *)
00078 {
00079 return Value (false);
00080 }
00081
00082
00083 Value func_true (valVector, ValueCalc *, FuncExtra *)
00084 {
00085 return Value (true);
00086 }
00087
00088
00089 bool asBool (Value val, ValueCalc *calc)
00090 {
00091 return calc->conv()->asBoolean (val).asBoolean ();
00092 }
00093
00094
00095 Value func_not (valVector args, ValueCalc *calc, FuncExtra *)
00096 {
00097 bool val = asBool (args[0], calc) ? false : true;
00098 return Value (val);
00099 }
00100
00101
00102 Value func_or (valVector args, ValueCalc *calc, FuncExtra *)
00103 {
00104 int cnt = args.count();
00105 for (int i = 0; i < cnt; ++i)
00106 if (asBool (args[i], calc))
00107
00108 return Value (true);
00109
00110 return Value (false);
00111 }
00112
00113
00114 Value func_nor (valVector args, ValueCalc *calc, FuncExtra *)
00115 {
00116
00117 int cnt = args.count();
00118 for (int i = 0; i < cnt; ++i)
00119 if (asBool (args[i], calc))
00120
00121 return Value (false);
00122
00123 return Value (true);
00124 }
00125
00126
00127 Value func_and (valVector args, ValueCalc *calc, FuncExtra *)
00128 {
00129 int cnt = args.count();
00130 for (int i = 0; i < cnt; ++i)
00131 if (!asBool (args[i], calc))
00132
00133 return Value (false);
00134
00135 return Value (true);
00136 }
00137
00138
00139 Value func_nand (valVector args, ValueCalc *calc, FuncExtra *)
00140 {
00141
00142 int cnt = args.count();
00143 for (int i = 0; i < cnt; ++i)
00144 if (!asBool (args[i], calc))
00145
00146 return Value (true);
00147
00148 return Value (false);
00149 }
00150
00151
00152 Value func_xor (valVector args, ValueCalc *calc, FuncExtra *)
00153 {
00154
00155 int cnt = args.count();
00156 int count = 0;
00157 for (int i = 0; i < cnt; ++i)
00158 if (asBool (args[i], calc))
00159 count++;
00160 return Value (count == 1);
00161 }
00162
00163
00164 Value func_if (valVector args, ValueCalc *calc, FuncExtra *)
00165 {
00166 if (asBool (args[0], calc))
00167 return args[1];
00168 else
00169 return args[2];
00170 }