ztsdb
base_funcs.hpp
1 // (C) 2016 Leonardo Silvestri
2 //
3 // This file is part of ztsdb.
4 //
5 // ztsdb is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // ztsdb is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with ztsdb. If not, see <http://www.gnu.org/licenses/>.
17 
18 
19 #ifndef BASE_FUNCS
20 #define BASE_FUNCS
21 
22 #include <vector>
23 #include <cmath>
24 #include <cfenv>
25 #include "valuevar.hpp"
26 #include "interp_error.hpp"
27 
28 
29 namespace zcore {
30  struct InterpCtx;
31 }
32 
33 
34 // TODO:
35 // nchar
36 // mean
37 // rep
38 namespace funcs {
39 
40  val::Value all(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
41  val::Value any(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
42 
43  val::Value is_nan(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
44  val::Value is_infinite(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
45  val::Value all_equal(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
46 
47  val::Value as_logical(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
48  val::Value as_integer(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
49  val::Value as_numeric(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
50  val::Value as_character(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
51  val::Value as_duration(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
52  val::Value as_period(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
53  val::Value as_time(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
54  val::Value as_interval(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
55  val::Value make_time(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
56  val::Value make_period(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
57  val::Value period_month(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
58  val::Value period_day(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
59  val::Value period_duration(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
60 
61  val::Value character(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
62  val::Value _interval(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
63  val::Value interval_start(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
64  val::Value interval_end(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
65  val::Value interval_sopen(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
66  val::Value interval_eopen(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
67 
68  val::Value vlist(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
69  val::Value is_null(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
70 
71  // array ------------> base_funcs_array.cpp
72  val::Value c(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
73  val::Value t(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
74  val::Value length(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
75  val::Value make_connection(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
76  val::Value connection_port(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
77  val::Value connection_address(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
78  val::Value make_timer(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
79  val::Value make_zts(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
80  val::Value zts_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
81  val::Value zts_data(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
82  val::Value zts_resize(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
83  val::Value zts_truncate(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
84  val::Value make_vector(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
85  val::Value make_matrix(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
86  val::Value make_array(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
87  val::Value ncol(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
88  val::Value nrow(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
89  val::Value dim(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
90  val::Value abind(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
91  val::Value rbind(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
92  val::Value cbind(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
93  val::Value subset(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
94  val::Value dblsubset(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
95  val::Value subassign(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
96  val::Value dblsubassign(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
97  val::Value get_typeof(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
98  val::Value load(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
99  val::Value _sort(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
100  val::Value _sort_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
101  val::Value is_ordered(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
102  val::Value head(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
103  val::Value tail(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
104  val::Value runif(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
105  val::Value rnorm(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
106  val::Value set_seed(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
107  val::Value msync(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
108  val::Value alloc_dirname(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
109  val::Value lock(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
110  val::Value unlock(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
111  val::Value islocked(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
112 
113  val::Value dyn_load(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
114  val::Value _options(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
115 
116  val::Value cat(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
117  val::Value paste(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
118 
119  val::Value read_csv(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
120  val::Value substr(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
121  val::Value write_csv(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
122 
123  val::Value dimnames(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
124  val::Value colnames(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
125  val::Value rownames(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
126 
127  // the following need access to the continuation, so they are implemented in interp:
128  val::Value getvar(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
129  val::Value ls(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
130  val::Value assign(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
131  val::Value rm(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
132  val::Value source(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
133  val::Value tryCatch(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
134  val::Value do_call(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
135  val::Value print(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
136  val::Value str(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
137 
138  val::Value stats_net(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
139  val::Value stats_msg(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
140  val::Value stats_ctx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
141  val::Value info_net(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
142  val::Value info_msg(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
143  val::Value info_ctx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
144 
145  // math ------------> base_funcs_math.cpp
146  val::Value _sin(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
147  val::Value _cos(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
148  val::Value _tan(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
149  val::Value _sinh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
150  val::Value _cosh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
151  val::Value _tanh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
152  val::Value _asin(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
153  val::Value _acos(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
154  val::Value _atan(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
155  val::Value _asinh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
156  val::Value _acosh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
157  val::Value _atanh(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
158  val::Value _floor(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
159  val::Value _ceiling(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
160  val::Value op(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
161 
162 
163  // rolling functions:
164  val::Value rollmean(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
165  val::Value rollmin(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
166  val::Value rollmax(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
167  val::Value rollvar(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
168  val::Value rollcov(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
169  val::Value locf(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
170  val::Value move(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
171  val::Value rotate(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
172  val::Value diff(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
173  val::Value cumsum(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
174  val::Value cumprod(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
175  val::Value cumdiv(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
176  val::Value cummax(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
177  val::Value cummin(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
178  val::Value rev(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
179  val::Value sum(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
180  val::Value prod(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
181  val::Value _min(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
182  val::Value _max(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
183 
184  // system and general utilities
185  val::Value quit(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
186  val::Value stop(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
187  val::Value system(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
188 
189  // date/time
190  val::Value sys_time(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
191 
192  val::Value seq(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
193 
194  // set functions
195  val::Value intersect(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
196  val::Value _union(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
197  val::Value setdiff(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
198  val::Value intersect_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
199  val::Value union_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
200  val::Value setdiff_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
201 
202  val::Value align(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
203  val::Value align_idx(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
204  val::Value op_zts(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
205 
206  // time
207  val::Value dayweek(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
208  val::Value daymonth(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
209  val::Value month(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
210  val::Value year(vector<val::VBuiltinG::arg_t>& v, zcore::InterpCtx& ic);
211 
212 
215  template <template<typename...> class F, typename... T>
216  inline val::Value apply_to_types(val::Value& v, const yy::location& l) {
217  throw interp::EvalException("incorrect argument type", l);
218  }
219  template <template<typename...> class F, val::ValType H, val::ValType... T>
220  inline val::Value apply_to_types(val::Value& v, const yy::location& l) {
221  return H == v.which() ? F<typename val::gettype<H>::TP>::f(v, l) : apply_to_types<F, T...>(v, l);
222  }
223  // 2 args:
224  template <template<typename, typename FA1> class F,
225  typename FA1, typename... T>
226  inline val::Value apply_to_types2(val::Value& v, FA1 a1,
227  const yy::location& lv, const yy::location& l1) {
228  throw interp::EvalException("incorrect argument type", lv);
229  }
230  template <template<typename, typename FA1> class F,
231  typename FA1, val::ValType H, val::ValType... T>
232  inline val::Value apply_to_types2(val::Value& v, FA1 a1,
233  const yy::location& lv, const yy::location& l1) {
234  return H == v.which() ? F<typename val::gettype<H>::TP, FA1>::f(v, a1, lv, l1) :
235  apply_to_types2<F, FA1, T...>(v, a1, lv, l1);
236  }
237  // 3 args:
238  template <template<typename, typename FA1, typename FA2> class F,
239  typename FA1, typename FA2, typename... T>
240  inline val::Value apply_to_types3(val::Value& v, FA1 a1, FA2 a2, const yy::location& lv,
241  const yy::location& l1) {
242  throw interp::EvalException("incorrect argument type", lv);
243  }
244  template <template<typename, typename FA1, typename FA2> class F,
245  typename FA1, typename FA2, val::ValType H, val::ValType... T>
246  inline val::Value apply_to_types3(val::Value& v, FA1 a1, FA2 a2,
247  const yy::location& lv, const yy::location& l1) {
248  return H == v.which() ? F<typename val::gettype<H>::TP, FA1, FA2>::f(v, a1, a2, lv, l1) :
249  apply_to_types3<F, FA1, FA2, T...>(v, a1, a2, lv, l1);
250  }
251 
253  template <template<typename...> class F, typename... T>
254  inline val::Value apply_to_types_null(val::Value& v, const yy::location& l) {
255  return val::VNull();
256  }
257  template <template<typename...> class F, val::ValType H, val::ValType... T>
258  inline val::Value apply_to_types_null(val::Value& v, const yy::location& l) {
259  return H == v.which() ? F<typename val::gettype<H>::TP>::f(v) : apply_to_types_null<F, T...>(v, l);
260  }
261 
263  inline ssize_t getInt(double d, const yy::location& l) {
264  std::feclearexcept(FE_ALL_EXCEPT);
265  static_assert(sizeof(ssize_t)==sizeof(long long), "sizeof(ssize_t)==sizeof(long long)");
266  auto res = llrint(d);
267  if (std::fetestexcept(FE_INVALID)) {
268  throw interp::EvalException("argument cannot be converted to an integer", l);
269  }
270  if (std::fetestexcept(FE_INEXACT)) {
271  throw interp::EvalException("argument is not an integer", l);
272  }
273  return res;
274  }
275 
277  inline size_t getUint(double d, const yy::location& l) {
278  if (d < 0) {
279  throw interp::EvalException("argument cannot be negative", l);
280  }
281  return getInt(d, l);
282  }
283 
284 }
285 
286 #endif
val::VNull
Definition: valuevar.hpp:75
yy::location
Abstract a location.
Definition: location.hpp:54
zcore::InterpCtx
Definition: interp_ctx.hpp:129
arr::rollcov
Array< T > rollcov(const Array< T > &x, const Array< T > &y, idx_type window, idx_type nbvalid)
Definition: array_ops.hpp:323
interp::EvalException
Definition: interp_error.hpp:37