NEURON
oc_ansi.h
Go to the documentation of this file.
1 #pragma once
4 
5 #include <cstdio>
6 #include <functional>
7 #include <memory>
8 #include <stdexcept>
9 #include <string>
10 #include <string_view>
11 
12 #include "memory.hpp"
13 /**
14  * \dir
15  * \brief HOC Interpreter
16  *
17  * \file
18  * \brief HOC interpreter function declarations (included by hocdec.h)
19  */
20 
21 /**
22  * @defgroup HOC HOC Interpreter
23  * @brief All HOC interpreter related implementation details
24  *
25  * @defgroup hoc_functions HOC Functions
26  * @ingroup HOC
27  * @brief All hoc functions used in the NEURON codebase
28  * @{
29  */
30 
31 struct Arrayinfo;
32 struct cTemplate;
33 struct DoubScal;
34 struct DoubVec;
35 struct HocSymExtension;
36 class IvocVect;
37 struct Object;
38 union Objectdata;
39 struct Symbol;
40 struct Symlist;
41 struct VoidFunc;
42 struct Prop;
43 
44 namespace neuron {
45 struct model_sorted_token;
46 }
47 
48 // nocpout.cpp
49 Symbol* hoc_get_symbol(const char* var);
51 void ivoc_help(const char*);
52 
53 Symbol* hoc_lookup(const char*);
54 
55 [[noreturn]] void hoc_execerror(const char*, const char*);
56 [[noreturn]] void hoc_execerr_ext(const char* fmt, ...);
57 char* hoc_object_name(Object*);
58 void hoc_retpushx(double);
59 
60 namespace neuron::oc {
61 struct runtime_error: ::std::runtime_error {
62  using ::std::runtime_error::runtime_error;
63 };
64 /**
65  * @brief Execute C++ code that may throw and propagate HOC information.
66  *
67  * Low level C++ code called from HOC/Python may throw exceptions that do not carry any information
68  * about the HOC/Python expression that generated the exception. This can lead to unhelpful error
69  * messages if the exception is caught high up the stack. This wrapper is designed to be used at the
70  * points where we leave the HOC world and call lower level code. If that lower level code throws an
71  * exception, the message will be passed to hoc_execerror. This saves additional information so that
72  * the final error message provides additional context. If the "lower level" code called
73  * hoc_execerror itself then we pass on the exception without re-calling hoc_execerror.
74  */
75 template <typename Callable, typename... Args>
76 decltype(auto) invoke_method_that_may_throw(Callable message_prefix, Args&&... args) {
77  try {
78  return std::invoke(std::forward<Args>(args)...);
79  } catch (runtime_error const&) {
80  // This message was thrown by hoc_execerror; just pass it on
81  throw;
82  } catch (std::exception const& e) {
83  std::string message{message_prefix()};
84  std::string_view what{e.what()};
85  if (!what.empty()) {
86  message.append(": ");
87  message.append(what);
88  }
89  hoc_execerror(message.c_str(), nullptr);
90  }
91 }
92 } // namespace neuron::oc
93 
94 double* hoc_getarg(int);
95 int ifarg(int);
96 
97 int vector_instance_px(void*, double**);
98 void install_vector_method(const char*, double (*)(void*));
99 
100 int vector_arg_px(int i, double** p);
101 
102 double hoc_Exp(double);
103 extern "C" double hoc_pow(double, double);
104 int hoc_is_tempobj_arg(int narg);
105 std::FILE* hoc_obj_file_arg(int i);
106 void hoc_reg_nmodl_text(int type, const char* txt);
107 void hoc_reg_nmodl_filename(int type, const char* filename);
108 std::size_t nrn_mallinfo(int item);
109 int nrn_mlh_gsort(double* vec, int* base_ptr, int total_elems, int (*cmp)(double, double));
110 void state_discontinuity(int i, double* pd, double d);
111 
112 IvocVect* vector_arg(int);
115 IvocVect* vector_new(int, Object* = nullptr);
117 IvocVect* vector_new1(int);
120 void vector_resize(IvocVect*, int);
121 double* vector_vec(IvocVect*);
122 
123 // olupton 2022-01-21: These overloads are added for backwards compatibility
124 // with pre-C++ mechanisms.
125 [[deprecated("non-void* overloads are preferred")]] int vector_buffer_size(void*);
126 [[deprecated("non-void* overloads are preferred")]] int vector_capacity(void*);
127 [[deprecated("non-void* overloads are preferred")]] Object** vector_pobj(void*);
128 [[deprecated("non-void* overloads are preferred")]] void vector_resize(void*, int);
129 [[deprecated("non-void* overloads are preferred")]] double* vector_vec(void*);
130 
131 extern int nrnignore;
132 
133 /**
134  * \brief Brief explanation of hoc_obj_run
135  *
136  * Detailed explanation of hoc_obj_run goes here.
137  */
138 int hoc_obj_run(const char*, Object*);
139 
140 void hoc_prstack();
141 int hoc_argtype(int);
142 int hoc_is_double_arg(int);
143 int hoc_is_pdouble_arg(int);
144 int hoc_is_str_arg(int);
145 int hoc_is_object_arg(int);
146 char* hoc_gargstr(int);
147 char** hoc_pgargstr(int);
148 
149 Object** hoc_objgetarg(int);
150 Object* hoc_name2obj(const char* name, int index);
151 
152 char** hoc_temp_charptr();
153 int hoc_is_temp_charptr(char** cpp);
154 void hoc_assign_str(char** pstr, const char* buf);
155 double chkarg(int, double low, double high);
156 // push first arg first. Warning: if the function is inside an object make sure
157 // you know what you are doing.
158 double hoc_call_func(Symbol*, int narg);
160 // call a fuction within the context of an object.
161 double hoc_call_objfunc(Symbol*, int narg, Object*);
162 extern double hoc_ac_;
163 extern double hoc_epsilon;
164 extern int nrn_inpython_;
165 
166 extern int hoc_color;
167 int hoc_set_color(int);
168 void hoc_plt(int, double, double);
169 void hoc_plprint(const char*);
170 void hoc_ret(); /* but need to push before returning */
171 
173 template <typename T>
176 }
177 void hoc_pushx(double);
178 void hoc_pushstr(char**);
179 void hoc_pushobj(Object**);
180 void hoc_push_object(Object*);
181 void hoc_pushpx(double*);
182 void hoc_pushs(Symbol*);
183 void hoc_pushi(int);
184 void hoc_push_ndim(int);
185 int hoc_pop_ndim();
186 int hoc_stack_type();
188 
190 template <typename>
192 template <typename>
194 } // namespace neuron::oc::detail
195 
196 /** @brief Pop an object of type T from the HOC stack.
197  *
198  * The helper type neuron::oc::detail::hoc_pop must be specialised for all
199  * supported (families of) T.
200  */
201 template <typename T>
202 T hoc_pop() {
204 }
205 
206 /** @brief Get the nth (1..N) argument on the stack.
207  *
208  * This is a templated version of hoc_getarg, hoc_pgetarg and friends.
209  *
210  * @todo Should the stack be modified such that this can return const
211  * references, even for things like data_handle<T> that at the moment are not
212  * exactly stored (we store generic_data_handle, which can produce a
213  * data_handle<T> on demand but which does not, at present, actually *contain*
214  * a data_handle<T>)?
215  */
216 template <typename T>
217 [[nodiscard]] T hoc_get_arg(std::size_t narg) {
219 }
220 
221 namespace neuron::oc::detail {
222 template <>
225 };
226 template <typename T>
230  hoc_get_arg<neuron::container::generic_data_handle>(narg)};
231  }
232 };
233 template <>
235  /** @brief Pop a generic data handle from the HOC stack.
236  *
237  * This function is not used from translated MOD files, so we can assume
238  * that the generic_data_handle is not in permissive mode.
239  */
241 };
242 
243 template <typename T>
245  /** @brief Pop a data_handle<T> from the HOC stack.
246  */
248  return neuron::container::data_handle<T>{hoc_pop<neuron::container::generic_data_handle>()};
249  }
250 };
251 } // namespace neuron::oc::detail
252 
253 [[nodiscard]] inline double* hoc_pgetarg(int narg) {
254  return static_cast<double*>(hoc_get_arg<neuron::container::data_handle<double>>(narg));
255 }
256 
257 double hoc_xpop();
258 Symbol* hoc_spop();
259 double* hoc_pxpop();
260 Object** hoc_objpop();
262  void operator()(Object*) const;
263 };
264 using TmpObject = std::unique_ptr<Object, TmpObjectDeleter>;
266 char** hoc_strpop();
267 int hoc_ipop();
268 void hoc_nopop();
269 
270 /** @brief Shorthand for hoc_pop<data_handle<T>>().
271  */
272 template <typename T>
274  return hoc_pop<neuron::container::data_handle<T>>();
275 }
276 
277 /**
278  * @brief Shorthand for hoc_get_arg<data_handle<T>>(narg).
279  *
280  * Migrating code to be data_handle-aware typically involves replacing hoc_pgetarg with
281  * hoc_hgetarg<double>.
282  */
283 template <typename T>
285  return hoc_get_arg<neuron::container::data_handle<T>>(narg);
286 }
287 
288 [[noreturn]] void hoc_execerror_mes(const char*, const char*, int);
289 void hoc_warning(const char*, const char*);
290 double* hoc_val_pointer(const char*);
292 Symbol* hoc_table_lookup(const char*, Symlist*);
293 Symbol* hoc_install(const char*, int, double, Symlist**);
294 extern Objectdata* hoc_objectdata;
295 /** @brief Get the stack entry at depth i.
296  *
297  * i=0 is the most recently pushed entry. This will raise an error if the stack
298  * is empty, or if the given entry does not have type T.
299  */
300 template <typename T>
301 T const& hoc_look_inside_stack(int i);
303 void hoc_stkobj_unref(Object*, int stkindex);
304 size_t hoc_total_array_data(const Symbol*, Objectdata*);
305 char* hoc_araystr(Symbol*, int, Objectdata*);
306 
308 const char* expand_env_var(const char*);
309 void check_obj_type(Object*, const char*);
310 int is_obj_type(Object*, const char*);
311 void hoc_obj_ref(Object*); /* NULL allowed */
312 void hoc_obj_unref(Object*); /* NULL allowed */
313 void hoc_dec_refcount(Object**);
314 Object** hoc_temp_objvar(Symbol* template_symbol, void* cpp_object);
316 Object* hoc_new_object(Symbol* symtemp, void* v);
317 void hoc_new_object_asgn(Object** obp, Symbol* template_symbol, void* cpp_object);
318 Object* nrn_pntproc_nmodlrandom_wrap(void* pnt, Symbol* sym);
320 HocSymExtension* hoc_var_extra(const char*);
321 double check_domain_limits(float*, double);
322 Object* hoc_obj_get(int i);
323 void hoc_obj_set(int i, Object*);
324 void nrn_hoc_lock();
325 void nrn_hoc_unlock();
326 
327 [[noreturn]] void nrn_exit(int);
328 void hoc_free_list(Symlist**);
329 int hoc_errno_check();
330 Symbol* hoc_parse_stmt(const char*, Symlist**);
331 void hoc_run_stmt(Symbol*);
332 Symbol* hoc_parse_expr(const char*, Symlist**);
333 double hoc_run_expr(Symbol*);
334 void hoc_free_string(char*);
335 int hoc_xopen1(const char*, const char*);
336 int hoc_xopen_run(Symbol*, const char*);
337 void hoc_symbol_limits(Symbol*, float, float);
338 void sym_extra_alloc(Symbol*);
339 int hoc_chdir(const char* path);
340 
341 void hoc_final_exit();
342 void hoc_sprint1(char**, int);
343 double hoc_scan(std::FILE*);
344 char* hoc_symbol_units(Symbol* sym, const char* units);
345 void hoc_fake_call(Symbol*);
346 void hoc_last_init();
347 void hoc_obj_notify(Object*);
348 int ivoc_list_count(Object*);
350 double hoc_func_table(void* vpft, int n, double* args);
351 void hoc_spec_table(void** pfunctable, int n);
352 void* hoc_sec_internal_name2ptr(const char* s, int eflag);
353 void* hoc_pysec_name2ptr(const char* s, int eflag);
354 extern void* nrn_parsing_pysec_;
355 
356 void vector_append(IvocVect*, double);
357 void vector_delete(IvocVect*);
358 
360 
361 int is_vector_arg(int);
362 
363 char* vector_get_label(IvocVect*);
364 void vector_set_label(IvocVect*, char*);
365 
366 Symbol* hoc_install_var(const char*, double*);
368 void hoc_spinit();
369 void hoc_freearay(Symbol*);
370 int hoc_arayinfo_install(Symbol*, int);
372 void hoc_free_val_array(double*, std::size_t);
373 std::size_t hoc_total_array(Symbol*);
374 void frame_debug();
376 void hoc_init();
377 void initplot();
378 void hoc_audit_command(const char*);
379 void hoc_audit_from_hoc_main1(int, const char**, const char**);
381 void hoc_audit_from_xopen1(const char*, const char*);
382 void hoc_xopen_from_audit(const char* fname);
384 int hoc_retrieve_audit(int id);
385 int hoc_saveaudit();
386 
387 void hoc_close_plot();
388 void ivoc_cleanup();
389 void ivoc_final_exit();
390 [[nodiscard]] int hoc_oc(const char*);
391 [[nodiscard]] int hoc_oc(const char*, std::ostream& os);
392 void hoc_initcode();
393 int hoc_ParseExec(int);
394 int hoc_get_line();
395 int hoc_araypt(Symbol*, int);
396 double hoc_opasgn(int op, double dest, double src);
398 void hoc_template_notify(Object*, int);
399 void hoc_construct_point(Object*, int);
400 void hoc_call_ob_proc(Object* ob, Symbol* sym, int narg);
401 void hoc_push_frame(Symbol*, int);
402 void hoc_pop_frame();
403 int hoc_argindex();
404 void hoc_pop_defer();
405 void hoc_tobj_unref(Object**);
406 int hoc_stacktype();
407 int hoc_inside_stacktype(int);
410 void notify_freed(void*);
411 void notify_pointer_freed(void*);
412 int ivoc_list_look(Object*, Object*, char*, int);
413 void ivoc_free_alias(Object*);
414 Symbol* ivoc_alias_lookup(const char*, Object*);
416 void hoc_free_object(Object*);
417 void hoc_free_pstring(char**);
418 extern int hoc_returning;
419 void hoc_on_init_register(void (*)());
420 int hoc_pid();
421 int hoc_ired(const char*, int, int, int);
422 double hoc_xred(const char*, double, double, double);
423 int hoc_sred(const char*, char*, char*);
424 void nrnpy_pass();
426 int nrn_is_cable();
427 void* nrn_opaque_obj2pyobj(Object*); // PyObject reference not incremented
428 Symbol* hoc_get_symbol(const char* var);
429 
430 void bbs_done(void);
431 int hoc_main1(int, const char**, const char**);
432 char* cxx_char_alloc(std::size_t size);
433 
434 extern int stoprun;
435 extern int nrn_mpiabort_on_error_;
436 
437 /** @} */ // end of hoc_functions
#define v
Definition: md1redef.h:11
#define i
Definition: md1redef.h:19
#define prop
Definition: md1redef.h:38
char buf[512]
Definition: init.cpp:13
char * hoc_object_pathname(Object *)
Definition: hoc_oop.cpp:1828
int hoc_xopen1(const char *, const char *)
Definition: fileio.cpp:166
int vector_capacity(IvocVect *)
Definition: ivocvect.cpp:278
int hoc_is_object_arg(int)
Definition: code.cpp:876
void initplot()
Definition: plot.cpp:132
double hoc_xpop()
Definition: code.cpp:903
void hoc_push_frame(Symbol *, int)
Definition: code.cpp:1376
Object * hoc_name2obj(const char *name, int index)
Definition: hoc_oop.cpp:859
void hoc_plprint(const char *)
Definition: plot.cpp:97
void hoc_obj_set(int i, Object *)
Definition: hoc_oop.cpp:66
int stoprun
Definition: fadvance.cpp:146
void hoc_prstack()
Print up to the 10 most-recently-pushed elements on the stack.
Definition: code.cpp:437
void hoc_audit_command(const char *)
Definition: audit.cpp:122
void frame_debug()
Definition: code.cpp:1330
void nrn_hoc_unlock()
Definition: multicore.cpp:827
void hoc_reg_nmodl_filename(int type, const char *filename)
Definition: init.cpp:190
void hoc_push_ndim(int)
Definition: code.cpp:855
void hoc_run_stmt(Symbol *)
Definition: code2.cpp:672
void hoc_construct_point(Object *, int)
Definition: hocmech.cpp:68
int hoc_ired(const char *, int, int, int)
Definition: xred.cpp:56
void hoc_xopen_from_audit(const char *fname)
Definition: audit.cpp:248
void hoc_unlink_symbol(Symbol *, Symlist *)
Definition: symbol.cpp:131
int hoc_retrieving_audit()
Definition: audit.cpp:185
int hoc_obj_run(const char *, Object *)
Brief explanation of hoc_obj_run.
Definition: hoc_oop.cpp:315
void sym_extra_alloc(Symbol *)
Definition: symbol.cpp:248
void * nrn_opaque_obj2pyobj(Object *)
Definition: hoc_oop.cpp:2119
Object ** hoc_objgetarg(int)
Definition: code.cpp:1614
void hoc_pushstr(char **)
Definition: code.cpp:800
void hoc_execerr_ext(const char *fmt,...)
printf style specification of hoc_execerror message.
Definition: fileio.cpp:828
HocSymExtension * hoc_var_extra(const char *)
Definition: code2.cpp:38
void hoc_close_plot()
Definition: plot.cpp:177
double hoc_func_table(void *vpft, int n, double *args)
Definition: functabl.cpp:75
double chkarg(int, double low, double high)
Definition: code2.cpp:626
void hoc_reg_nmodl_text(int type, const char *txt)
Definition: init.cpp:185
void hoc_execerror(const char *, const char *)
Definition: hoc.cpp:658
double * hoc_getarg(int)
Definition: code.cpp:1641
Object * ivoc_list_item(Object *, int)
Definition: oclist.cpp:402
Object * nrn_nmodlrandom_wrap(Prop *prop, Symbol *sym)
double hoc_call_func(Symbol *, int narg)
Definition: code.cpp:1477
Symbol * hoc_get_symbol(const char *var)
Definition: code.cpp:1768
int hoc_saveaudit()
Definition: audit.cpp:161
int hoc_argindex()
Definition: code.cpp:1647
int ivoc_list_look(Object *, Object *, char *, int)
Definition: oclist.cpp:462
char ** hoc_strpop()
Definition: code.cpp:962
void hoc_new_object_asgn(Object **obp, Symbol *template_symbol, void *cpp_object)
Definition: hoc_oop.cpp:478
int hoc_set_color(int)
Definition: plot.cpp:549
size_t hoc_total_array_data(const Symbol *, Objectdata *)
Definition: hoc_oop.cpp:95
neuron::container::data_handle< double > hoc_val_handle(std::string_view)
Definition: code2.cpp:715
Object * hoc_obj_look_inside_stack(int)
Definition: code.cpp:885
int hoc_returning
Definition: code.cpp:81
char * cxx_char_alloc(std::size_t size)
void hoc_ret()
Definition: code.cpp:1502
int hoc_arayinfo_install(Symbol *, int)
Definition: hoc.cpp:528
Object ** hoc_temp_objvar(Symbol *template_symbol, void *cpp_object)
Definition: hoc_oop.cpp:484
void hoc_final_exit()
Definition: hoc.cpp:949
void vector_resize(IvocVect *, int)
Definition: ivocvect.cpp:302
int vector_instance_px(void *, double **)
Definition: ivocvect.cpp:372
IvocVect * vector_new2(IvocVect *)
Definition: ivocvect.cpp:293
void hoc_template_notify(Object *, int)
Definition: ocobserv.cpp:37
void hoc_pushpx(double *)
Definition: code.cpp:834
neuron::container::data_handle< T > hoc_pop_handle()
Shorthand for hoc_pop<data_handle<T>>().
Definition: oc_ansi.h:273
IvocVect * vector_new(int, Object *=nullptr)
Definition: ivocvect.cpp:284
std::unique_ptr< Object, TmpObjectDeleter > TmpObject
Definition: oc_ansi.h:264
int hoc_inside_stacktype(int)
Definition: code.cpp:898
int vector_arg_px(int i, double **p)
Definition: ivocvect.cpp:396
void hoc_pushobj(Object **)
Definition: code.cpp:784
int nrn_inpython_
Definition: hoc.cpp:52
Object ** hoc_objpop()
Pop pointer to object pointer and return top elem from stack.
Definition: code.cpp:943
int hoc_errno_check()
Definition: math.cpp:257
int ivoc_list_count(Object *)
Definition: oclist.cpp:396
void hoc_free_string(char *)
Definition: symbol.cpp:290
void hoc_call_ob_proc(Object *ob, Symbol *sym, int narg)
Definition: hoc_oop.cpp:648
int hoc_pid()
Definition: hoc.cpp:773
void hoc_spec_table(void **pfunctable, int n)
Definition: functabl.cpp:107
Object * hoc_obj_get(int i)
Definition: hoc_oop.cpp:57
double hoc_xred(const char *, double, double, double)
Definition: xred.cpp:65
void hoc_init()
Definition: hoc_init.cpp:232
char * hoc_gargstr(int)
void ivoc_cleanup()
Definition: ocnoiv1.cpp:15
int hoc_ParseExec(int)
Definition: code.cpp:603
void hoc_freearay(Symbol *)
Definition: hoc.cpp:567
double check_domain_limits(float *, double)
Definition: code2.cpp:116
T hoc_get_arg(std::size_t narg)
Get the nth (1..N) argument on the stack.
Definition: oc_ansi.h:217
void * hoc_sec_internal_name2ptr(const char *s, int eflag)
Definition: cabcode.cpp:764
void hoc_plt(int, double, double)
Definition: plot.cpp:188
void * nrn_parsing_pysec_
void hoc_last_init()
Definition: init.cpp:308
int hoc_stack_type()
Get the type of the top entry.
Definition: code.cpp:310
void hoc_pushs(Symbol *)
Definition: code.cpp:841
void vector_set_label(IvocVect *, char *)
Definition: ivocvect.cpp:320
Symbol * hoc_install(const char *, int, double, Symlist **)
Definition: symbol.cpp:77
std::FILE * hoc_obj_file_arg(int i)
Definition: ocfile.cpp:47
double * vector_vec(IvocVect *)
Definition: ivocvect.cpp:308
void hoc_free_object(Object *)
Definition: symbol.cpp:283
int hoc_is_str_arg(int)
Definition: code.cpp:872
void hoc_audit_from_xopen1(const char *, const char *)
Definition: audit.cpp:130
int hoc_retrieve_audit(int id)
Definition: audit.cpp:224
int hoc_stacktype()
Definition: code.cpp:774
int hoc_is_temp_charptr(char **cpp)
Definition: code.cpp:722
void hoc_free_pstring(char **)
Definition: symbol.cpp:294
int hoc_get_line()
Definition: hoc.cpp:1613
double * hoc_pxpop()
Definition: code.cpp:922
void notify_pointer_freed(void *)
Definition: ivoc.cpp:132
bool hoc_stack_type_is_ndim()
Definition: code.cpp:314
Symbol * hoc_table_lookup(const char *, Symlist *)
Definition: symbol.cpp:48
void hoc_oop_initaftererror()
Definition: hoc_oop.cpp:412
Object * nrn_pntproc_nmodlrandom_wrap(void *pnt, Symbol *sym)
Objectdata * hoc_objectdata
Definition: hoc_oop.cpp:122
T hoc_pop()
Pop an object of type T from the HOC stack.
Definition: oc_ansi.h:202
void nrn_exit(int)
Definition: hoc.cpp:183
void hoc_assign_str(char **pstr, const char *buf)
Definition: code.cpp:2263
void hoc_audit_from_final_exit()
Definition: audit.cpp:138
const char * expand_env_var(const char *)
Definition: fileio.cpp:113
double * hoc_val_pointer(const char *)
Definition: code2.cpp:728
Object ** hoc_temp_objptr(Object *)
Definition: code.cpp:151
int hoc_argtype(int)
Definition: code.cpp:860
void hoc_register_var(DoubScal *, DoubVec *, VoidFunc *)
Definition: hocusr.cpp:109
double hoc_opasgn(int op, double dest, double src)
Definition: code.cpp:1674
double hoc_call_objfunc(Symbol *, int narg, Object *)
Definition: hoc_oop.cpp:384
Object * hoc_new_object(Symbol *symtemp, void *v)
Definition: hoc_oop.cpp:450
void hoc_tobj_unref(Object **)
Definition: code.cpp:160
int hoc_ipop()
Definition: code.cpp:967
void install_vector_method(const char *, double(*)(void *))
Definition: ivocvect.cpp:361
Symbol * hoc_parse_expr(const char *, Symlist **)
Definition: code2.cpp:646
int is_obj_type(Object *, const char *)
Definition: hoc_oop.cpp:2110
int hoc_sred(const char *, char *, char *)
Definition: xred.cpp:133
int hoc_oc(const char *)
Definition: hoc.cpp:1314
double hoc_run_expr(Symbol *)
Definition: code2.cpp:638
void hoc_warning(const char *, const char *)
Definition: hoc.cpp:1355
char * hoc_symbol_units(Symbol *sym, const char *units)
Definition: code2.cpp:128
int hoc_is_double_arg(int)
Definition: code.cpp:864
void hoc_free_list(Symlist **)
Definition: symbol.cpp:254
int ifarg(int)
Definition: code.cpp:1607
std::size_t nrn_mallinfo(int item)
Definition: symbol.cpp:302
void check_obj_type(Object *, const char *)
Definition: hoc_oop.cpp:2098
void vector_append(IvocVect *, double)
Definition: ivocvect.cpp:323
char ** hoc_temp_charptr()
Definition: code.cpp:717
void hoc_obj_disconnect(Object *)
Definition: ocobserv.cpp:5
double hoc_Exp(double)
Definition: math.cpp:175
void ivoc_help(const char *)
Definition: ocnoiv1.cpp:14
int hoc_xopen_run(Symbol *, const char *)
Definition: code.cpp:667
void hoc_retpushx(double)
Definition: hocusr.cpp:154
int hoc_chdir(const char *path)
Definition: fileio.cpp:800
Symbol * hoc_install_var(const char *, double *)
Definition: symbol.cpp:123
void hoc_spinit()
Definition: hocusr.cpp:48
void ivoc_final_exit()
Definition: ivocmain.cpp:740
void hoc_obj_notify(Object *)
Definition: ocobserv.cpp:10
IvocVect * vector_arg(int)
Definition: ivocvect.cpp:265
void hoc_pop_defer()
Definition: code.cpp:318
double hoc_ac_
Definition: hoc_init.cpp:222
int hoc_pop_ndim()
Definition: code.cpp:933
void hoc_obj_ref(Object *)
Definition: hoc_oop.cpp:1844
char * hoc_object_name(Object *)
Definition: hoc_oop.cpp:73
double hoc_pow(double, double)
Definition: math.cpp:166
void * hoc_pysec_name2ptr(const char *s, int eflag)
Definition: cabcode.cpp:806
void ivoc_free_alias(Object *)
Definition: strfun.cpp:153
void hoc_symbol_limits(Symbol *, float, float)
Definition: code2.cpp:102
IvocVect * vector_new0()
Definition: ivocvect.cpp:287
void hoc_dec_refcount(Object **)
Definition: hoc_oop.cpp:1850
int hoc_main1(int, const char **, const char **)
Definition: hoc.cpp:867
void hoc_free_val_array(double *, std::size_t)
void hoc_install_object_data_index(Symbol *)
Definition: hoc_oop.cpp:297
Object ** vector_temp_objvar(IvocVect *)
Definition: ivocvect.cpp:314
int is_vector_arg(int)
Definition: ivocvect.cpp:378
neuron::container::data_handle< T > hoc_hgetarg(int narg)
Shorthand for hoc_get_arg<data_handle<T>>(narg).
Definition: oc_ansi.h:284
void nrnpy_pass()
Definition: fileio.cpp:819
void hoc_class_registration()
Definition: classreg.cpp:31
void hoc_fake_call(Symbol *)
Definition: code.cpp:1463
void hoc_on_init_register(void(*)())
void hoc_stkobj_unref(Object *, int stkindex)
Definition: code.cpp:337
void hoc_initcode()
Definition: code.cpp:473
void hoc_audit_from_hoc_main1(int, const char **, const char **)
Definition: audit.cpp:56
void hoc_pushx(double)
Definition: code.cpp:779
Symbol * hoc_spop()
Definition: code.cpp:928
Object ** vector_pobj(IvocVect *)
Definition: ivocvect.cpp:296
int nrnignore
Definition: hoc.cpp:42
double * hoc_pgetarg(int narg)
Definition: oc_ansi.h:253
int vector_buffer_size(IvocVect *)
Definition: ivocvect.cpp:272
int hoc_araypt(Symbol *, int)
Definition: code.cpp:2340
void hoc_execerror_mes(const char *, const char *, int)
Definition: hoc.cpp:611
std::size_t hoc_total_array(Symbol *)
Definition: hoc_oop.cpp:83
double hoc_scan(std::FILE *)
void hoc_sprint1(char **, int)
Definition: fileio.cpp:367
Symbol * hoc_lookup(const char *)
Definition: symbol.cpp:59
IvocVect * vector_new1(int)
Definition: ivocvect.cpp:290
void nrn_hoc_lock()
Definition: multicore.cpp:819
void state_discontinuity(int i, double *pd, double d)
Definition: init.cpp:1085
int hoc_is_pdouble_arg(int)
Definition: code.cpp:868
void hoc_free_arrayinfo(Arrayinfo *)
Definition: hoc.cpp:579
void hoc_pop_frame()
Definition: code.cpp:1387
void bbs_done(void)
Definition: ocbbs.cpp:76
T const & hoc_look_inside_stack(int i)
Get the stack entry at depth i.
Definition: code.cpp:261
void hoc_nopop()
Definition: code.cpp:972
void vector_delete(IvocVect *)
Definition: ivocvect.cpp:262
void hoc_obj_unref(Object *)
Definition: hoc_oop.cpp:1881
void hoc_call_func_result_on_stack(Symbol *s, int narg)
Definition: code.cpp:1482
int hoc_color
Definition: plot.cpp:85
Symbol * ivoc_alias_lookup(const char *, Object *)
Definition: strfun.cpp:144
void hoc_free_allobjects(cTemplate *, Symlist *, Objectdata *)
Definition: hoc_oop.cpp:1732
void hoc_pushi(int)
Definition: code.cpp:846
void notify_freed(void *)
Definition: ivoc.cpp:144
char * vector_get_label(IvocVect *)
Definition: ivocvect.cpp:317
int nrn_mlh_gsort(double *vec, int *base_ptr, int total_elems, int(*cmp)(double, double))
Definition: ivocvect.cpp:3877
Symbol * hoc_parse_stmt(const char *, Symlist **)
Definition: code2.cpp:679
char * hoc_araystr(Symbol *, int, Objectdata *)
Definition: code.cpp:2281
void hoc_push_object(Object *)
Definition: code.cpp:793
int hoc_is_tempobj_arg(int narg)
Definition: code.cpp:881
void hoc_push(neuron::container::generic_data_handle handle)
Definition: code.cpp:850
void hoc_link_symbol(Symbol *, Symlist *)
Definition: symbol.cpp:155
TmpObject hoc_pop_object()
Definition: code.cpp:957
double hoc_epsilon
Definition: hoc_init.cpp:221
int nrn_is_cable()
Definition: init.cpp:226
int nrn_mpiabort_on_error_
Definition: hoc.cpp:80
char ** hoc_pgargstr(int)
Definition: code.cpp:1623
static int narg()
Definition: ivocvect.cpp:121
double var(InputIterator begin, InputIterator end)
Definition: ivocvect.h:108
const char * name
Definition: init.cpp:16
handle_interface< non_owning_identifier< storage > > handle
Non-owning handle to a Mechanism instance.
decltype(auto) invoke_method_that_may_throw(Callable message_prefix, Args &&... args)
Execute C++ code that may throw and propagate HOC information.
Definition: oc_ansi.h:76
In mechanism libraries, cannot use auto const token = nrn_ensure_model_data_are_sorted(); because the...
Definition: tnode.hpp:17
int const size_t const size_t n
Definition: nrngsl.h:10
size_t p
s
Definition: multisend.cpp:521
short index
Definition: cabvars.h:11
short type
Definition: cabvars.h:10
void units(unit *)
Definition: units.cpp:641
Definition: hocdec.h:173
Definition: section.h:231
Definition: model.h:47
Definition: hocdec.h:75
void operator()(Object *) const
Definition: code.cpp:950
Stable handle to a generic value.
Definition: data_handle.hpp:61
Non-template stable handle to a generic value.
static neuron::container::data_handle< T > impl(std::size_t narg)
Definition: oc_ansi.h:228
static neuron::container::generic_data_handle impl(std::size_t)
static neuron::container::data_handle< T > impl()
Pop a data_handle<T> from the HOC stack.
Definition: oc_ansi.h:247
static neuron::container::generic_data_handle impl()
Pop a generic data handle from the HOC stack.