C++ Mathematical Expression Toolkit (ExprTk) release
Loading...
Searching...
No Matches
exprtk_vector_resize_inline_example.cpp
Go to the documentation of this file.
1/*
2 **************************************************************
3 * C++ Mathematical Expression Toolkit Library *
4 * *
5 * Vector Resize Inline Within Expression Example *
6 * Author: Arash Partow (1999-2024) *
7 * URL: https://www.partow.net/programming/exprtk/index.html *
8 * *
9 * Copyright notice: *
10 * Free use of the Mathematical Expression Toolkit Library is *
11 * permitted under the guidelines and in accordance with the *
12 * most current version of the MIT License. *
13 * https://www.opensource.org/licenses/MIT *
14 * SPDX-License-Identifier: MIT *
15 * *
16 **************************************************************
17*/
18
19
20#include <cstdio>
21#include <string>
22#include <vector>
23#include <map>
24
25#include "exprtk.hpp"
26
27
28template <typename T>
30{
31public:
32
39 typedef std::map<void*,vv_ptr_t> map_t;
40
41 using exprtk::igeneric_function<T>::operator();
42
46
47 inline T operator()(parameter_list_t parameters) override
48 {
49 vector_t vector(parameters[0]);
50 size_t new_size = static_cast<std::size_t>(scalar_t(parameters[1])());
51 void* key = static_cast<void*>(&vector[0]);
52
53 typename map_t::iterator itr = vector_map_.find(key);
54
55 if (itr == vector_map_.end())
56 {
57 printf("my_vv_size_handler - Error: failed to find vector_view for address: %p\n",key);
58 return T(0);
59 }
60
61 exprtk::vector_view<T>& vv = *itr->second;
62
63 if (vv.base_size() < new_size)
64 {
65 printf("my_vv_size_handler - Error: vector_view for address: %p new size of %d greater than base_size of %d\n",
66 key,
67 static_cast<unsigned int>(new_size),
68 static_cast<unsigned int>(vv.base_size()));
69 return T(0);
70 }
71
72 return vv.set_size(new_size) ? T(1) : T(0);
73 }
74
76 {
77 vector_map_[vec_view.data()] = &vec_view;
78 }
79
80private:
81
83};
84
85template <typename T>
87{
88 typedef exprtk::symbol_table<T> symbol_table_t;
89 typedef exprtk::expression<T> expression_t;
90 typedef exprtk::parser<T> parser_t;
91
92 const std::string inline_resize_expression =
93 " var vec_original_size := v[]; "
94 " "
95 " for (var i := 1; i <= 2 * vec_original_size; i += 1) "
96 " { "
97 " if (resize(v,i) == true and v[] == i and sum(2v) == (i^2 + i)) "
98 " { "
99 " println('Success: set size: ', i ,' v[] = ', v[]); "
100 " } "
101 " else "
102 " { "
103 " println('Error: Failed to resize vector v to size: ', i); "
104 " } "
105 " }; ";
106
107 std::vector<T> v0 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
108 std::vector<T> v1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
109
111
112
114
115 my_vv_size_handler_t<T> vv_size_handler;
116 vv_size_handler.register_vector_view(vv);
117
118 symbol_table_t symbol_table;
119 symbol_table.add_vector ("v", vv);
120 symbol_table.add_function("resize", vv_size_handler);
121 symbol_table.add_package (io_package);
122
123 expression_t expression;
124 expression.register_symbol_table(symbol_table);
125
126 parser_t parser;
127
128 if (!parser.compile(inline_resize_expression, expression))
129 {
130 printf("Error: %s\tExpression: %s\n",
131 parser.error().c_str(),
132 inline_resize_expression.c_str());
133 return;
134 }
135
136 vv.rebase(v0.data());
137 vv_size_handler.register_vector_view(vv);
138 expression.value();
139
140 vv.rebase(v1.data());
141 vv_size_handler.register_vector_view(vv);
142 expression.value();
143}
144
145int main()
146{
147 vector_inline_resize_example<double>();
148 return 0;
149}
150
151
152/*
153 Build:
154 c++ -pedantic-errors -Wall -Wextra -Werror -O3 -DNDEBUG -o exprtk_vector_inline_resize_example exprtk_vector_inline_resize_example.cpp -L/usr/lib -lstdc++ -lm
155*/
igeneric_function(const std::string &param_seq="", const return_type rtr_type=e_rtrn_scalar)
Definition exprtk.hpp:19667
void rebase(data_ptr_t data)
Definition exprtk.hpp:4576
std::size_t base_size() const
Definition exprtk.hpp:4594
data_ptr_t data() const
Definition exprtk.hpp:4589
bool set_size(const std::size_t new_size)
Definition exprtk.hpp:4634
exprtk::igeneric_function< T > igfun_t
void register_vector_view(exprtk::vector_view< T > &vec_view)
T operator()(parameter_list_t parameters) override
vector_view< T > make_vector_view(T *data, const std::size_t size, const std::size_t offset=0)
Definition exprtk.hpp:4660