C++ Mathematical Expression Toolkit (ExprTk)
release
Toggle main menu visibility
Loading...
Searching...
No Matches
exprtk
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-2025) *
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
28
template
<
typename
T>
29
class
my_vv_size_handler_t
final :
public
exprtk::igeneric_function
<T>
30
{
31
public
:
32
33
typedef
typename
exprtk::igeneric_function<T>
igfun_t
;
34
typedef
typename
igfun_t::parameter_list_t
parameter_list_t
;
35
typedef
typename
igfun_t::generic_type
generic_type
;
36
typedef
typename
generic_type::vector_view
vector_t
;
37
typedef
typename
generic_type::scalar_view
scalar_t
;
38
typedef
exprtk::vector_view<T>
*
vv_ptr_t
;
39
typedef
std::map<void*,vv_ptr_t>
map_t
;
40
41
using
exprtk::igeneric_function
<T>::operator();
42
43
my_vv_size_handler_t
()
44
:
exprtk
::
igeneric_function
<T>(
"VT"
)
45
{}
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
75
void
register_vector_view
(
exprtk::vector_view<T>
& vec_view)
76
{
77
vector_map_
[vec_view.
data
()] = &vec_view;
78
}
79
80
private
:
81
82
map_t
vector_map_
;
83
};
84
85
template
<
typename
T>
86
void
vector_inline_resize_example
()
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
110
exprtk::vector_view<T>
vv =
exprtk::make_vector_view
(v0, v0.size());
111
112
113
exprtk::rtl::io::package<T>
io_package;
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
145
int
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
*/
exprtk::expression
Definition
exprtk.hpp:21832
exprtk::igeneric_function
Definition
exprtk.hpp:19972
exprtk::igeneric_function::parameter_list_t
generic_type::parameter_list parameter_list_t
Definition
exprtk.hpp:19984
exprtk::igeneric_function::igeneric_function
igeneric_function(const std::string ¶m_seq="", const return_type rtr_type=e_rtrn_scalar)
Definition
exprtk.hpp:19986
exprtk::igeneric_function::generic_type
type_store< T > generic_type
Definition
exprtk.hpp:19983
exprtk::parser
Definition
exprtk.hpp:22525
exprtk::symbol_table
Definition
exprtk.hpp:20090
exprtk::vector_view
Definition
exprtk.hpp:4635
exprtk::vector_view::rebase
void rebase(data_ptr_t data)
Definition
exprtk.hpp:4658
exprtk::vector_view::base_size
std::size_t base_size() const
Definition
exprtk.hpp:4689
exprtk::vector_view::data
data_ptr_t data() const
Definition
exprtk.hpp:4684
exprtk::vector_view::set_size
bool set_size(const std::size_t new_size)
Definition
exprtk.hpp:4747
my_vv_size_handler_t
Definition
exprtk_vector_resize_inline_example.cpp:30
my_vv_size_handler_t::igfun_t
exprtk::igeneric_function< T > igfun_t
Definition
exprtk_vector_resize_inline_example.cpp:33
my_vv_size_handler_t::register_vector_view
void register_vector_view(exprtk::vector_view< T > &vec_view)
Definition
exprtk_vector_resize_inline_example.cpp:75
my_vv_size_handler_t::map_t
std::map< void *, vv_ptr_t > map_t
Definition
exprtk_vector_resize_inline_example.cpp:39
my_vv_size_handler_t::vector_t
generic_type::vector_view vector_t
Definition
exprtk_vector_resize_inline_example.cpp:36
my_vv_size_handler_t::vector_map_
map_t vector_map_
Definition
exprtk_vector_resize_inline_example.cpp:82
my_vv_size_handler_t::generic_type
igfun_t::generic_type generic_type
Definition
exprtk_vector_resize_inline_example.cpp:35
my_vv_size_handler_t::vv_ptr_t
exprtk::vector_view< T > * vv_ptr_t
Definition
exprtk_vector_resize_inline_example.cpp:38
my_vv_size_handler_t::parameter_list_t
igfun_t::parameter_list_t parameter_list_t
Definition
exprtk_vector_resize_inline_example.cpp:34
my_vv_size_handler_t::operator()
T operator()(parameter_list_t parameters) override
Definition
exprtk_vector_resize_inline_example.cpp:47
my_vv_size_handler_t::my_vv_size_handler_t
my_vv_size_handler_t()
Definition
exprtk_vector_resize_inline_example.cpp:43
my_vv_size_handler_t::scalar_t
generic_type::scalar_view scalar_t
Definition
exprtk_vector_resize_inline_example.cpp:37
exprtk.hpp
vector_inline_resize_example
void vector_inline_resize_example()
Definition
exprtk_vector_resize_inline_example.cpp:86
main
int main()
Definition
exprtk_vector_resize_inline_example.cpp:145
exprtk
Definition
exprtk.hpp:60
exprtk::make_vector_view
vector_view< T > make_vector_view(T *data, const std::size_t size, const std::size_t offset=0)
Definition
exprtk.hpp:4783
exprtk::rtl::io::package
Definition
exprtk.hpp:44296
exprtk::type_store::scalar_view
Definition
exprtk.hpp:4956
exprtk::type_store::vector_view
type_view< T > vector_view
Definition
exprtk.hpp:4952
Generated by
1.17.0