diff options
author | Mike Buland <eichlan@xagasoft.com> | 2011-06-03 05:51:21 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2011-06-03 05:51:21 +0000 |
commit | 4f1e5849d4a48eb674d81164ba4baba4ad51a89f (patch) | |
tree | ee590deb9b6d99a73c24ea36877039d623d9cfd3 /src/functionrange.cpp | |
parent | e8a57991458cfaa536fcc0d8b9a72739a8859da5 (diff) | |
download | build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.gz build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.bz2 build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.xz build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.zip |
Added a range function. It works a lot like the range function in python,
if called with one parameter, it will produce a list of the numbers 1 through
the number provided inclusive, if two numbers, it will produce a list of all
numbers between the first and second parameter, inclusive, and if three
parameters are provided it will use the last one as a step.
Diffstat (limited to '')
-rw-r--r-- | src/functionrange.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/functionrange.cpp b/src/functionrange.cpp new file mode 100644 index 0000000..f45cf0e --- /dev/null +++ b/src/functionrange.cpp | |||
@@ -0,0 +1,71 @@ | |||
1 | #include "functionrange.h" | ||
2 | |||
3 | #include <bu/plugger.h> | ||
4 | PluginInterface3( pluginFunctionRange, range, FunctionRange, Function, | ||
5 | "Mike Buland", 0, 1 ); | ||
6 | |||
7 | FunctionRange::FunctionRange() | ||
8 | { | ||
9 | } | ||
10 | |||
11 | FunctionRange::~FunctionRange() | ||
12 | { | ||
13 | } | ||
14 | |||
15 | Bu::String FunctionRange::getName() const | ||
16 | { | ||
17 | return "range"; | ||
18 | } | ||
19 | |||
20 | Variable FunctionRange::call( Variable &input, VarList lParams ) | ||
21 | { | ||
22 | Variable vRet( Variable::typeList ); | ||
23 | int iLow = 1; | ||
24 | int iHigh = 1; | ||
25 | int iStep = 1; | ||
26 | if( lParams.getSize() == 1 ) | ||
27 | { | ||
28 | iHigh = lParams.first().toInt(); | ||
29 | } | ||
30 | else if( lParams.getSize() == 2 ) | ||
31 | { | ||
32 | iLow = lParams.first().toInt(); | ||
33 | iHigh = lParams.last().toInt(); | ||
34 | } | ||
35 | else if( lParams.getSize() == 3 ) | ||
36 | { | ||
37 | VarList::iterator i = lParams.begin(); | ||
38 | iLow = (*i).toInt(); | ||
39 | i++; | ||
40 | iHigh = (*i).toInt(); | ||
41 | i++; | ||
42 | iStep = (*i).toInt(); | ||
43 | } | ||
44 | if( iStep == 0 ) | ||
45 | throw Bu::ExceptionBase("Step cannot be zero."); | ||
46 | |||
47 | if( iHigh < iLow ) | ||
48 | { | ||
49 | if( iStep > 0 ) | ||
50 | throw Bu::ExceptionBase( | ||
51 | "If start is less than end then step must be negative."); | ||
52 | for( int j = iLow; j >= iHigh; j += iStep ) | ||
53 | { | ||
54 | vRet.append( Variable( j ) ); | ||
55 | } | ||
56 | } | ||
57 | else | ||
58 | { | ||
59 | if( iStep < 0 ) | ||
60 | throw Bu::ExceptionBase( | ||
61 | "If start is more than end then step must be positive."); | ||
62 | for( int j = iLow; j <= iHigh; j += iStep ) | ||
63 | { | ||
64 | vRet.append( Variable( j ) ); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | |||
69 | return vRet; | ||
70 | } | ||
71 | |||