Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
kill all trailling whitespaces
[simgrid.git] / src / simix / popping_bodies.cpp
1 /**********************************************************************/
2 /* File generated by src/simix/simcalls.py from src/simix/simcalls.in */
3 /*                                                                    */
4 /*                    DO NOT EVER CHANGE THIS FILE                    */
5 /*                                                                    */
6 /* change simcalls specification in src/simix/simcalls.in             */
7 /* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved.    */
8 /**********************************************************************/
9
10 /*
11  * Note that the name comes from http://en.wikipedia.org/wiki/Popping
12  * Indeed, the control flow is doing a strange dance in there.
13  *
14  * That's not about http://en.wikipedia.org/wiki/Poop, despite the odor :)
15  */
16
17 #include <functional>
18 #include "smx_private.h"
19 #include "src/mc/mc_forward.hpp"
20 #include "xbt/ex.h"
21 #include <simgrid/simix.hpp>
22 /** @cond */ // Please Doxygen, don't look at this
23
24 template<class R, class... T>
25 inline static R simcall(e_smx_simcall_t call, T const&... t)
26 {
27   smx_actor_t self = SIMIX_process_self();
28   simgrid::simix::marshal(&self->simcall, call, t...);
29   if (self != simix_global->maestro_process) {
30     XBT_DEBUG("Yield process '%s' on simcall %s (%d)", self->name.c_str(),
31               SIMIX_simcall_name(self->simcall.call), (int)self->simcall.call);
32     SIMIX_process_yield(self);
33   } else {
34     SIMIX_simcall_handle(&self->simcall, 0);
35   }
36   return simgrid::simix::unmarshal<R>(self->simcall.result);
37 }
38
39 inline static void simcall_BODY_process_kill(smx_actor_t process) {
40     /* Go to that function to follow the code flow through the simcall barrier */
41     if (0) simcall_HANDLER_process_kill(&SIMIX_process_self()->simcall, process);
42     return simcall<void, smx_actor_t>(SIMCALL_PROCESS_KILL, process);
43   }
44
45 inline static void simcall_BODY_process_killall(int reset_pid) {
46     /* Go to that function to follow the code flow through the simcall barrier */
47     if (0) simcall_HANDLER_process_killall(&SIMIX_process_self()->simcall, reset_pid);
48     return simcall<void, int>(SIMCALL_PROCESS_KILLALL, reset_pid);
49   }
50
51 inline static void simcall_BODY_process_cleanup(smx_actor_t process) {
52     /* Go to that function to follow the code flow through the simcall barrier */
53     if (0) SIMIX_process_cleanup(process);
54     return simcall<void, smx_actor_t>(SIMCALL_PROCESS_CLEANUP, process);
55   }
56
57 inline static void simcall_BODY_process_suspend(smx_actor_t process) {
58     /* Go to that function to follow the code flow through the simcall barrier */
59     if (0) simcall_HANDLER_process_suspend(&SIMIX_process_self()->simcall, process);
60     return simcall<void, smx_actor_t>(SIMCALL_PROCESS_SUSPEND, process);
61   }
62
63 inline static void simcall_BODY_process_resume(smx_actor_t process) {
64     /* Go to that function to follow the code flow through the simcall barrier */
65     if (0) SIMIX_process_resume(process);
66     return simcall<void, smx_actor_t>(SIMCALL_PROCESS_RESUME, process);
67   }
68
69 inline static void simcall_BODY_process_set_host(smx_actor_t process, sg_host_t dest) {
70     /* Go to that function to follow the code flow through the simcall barrier */
71     if (0) simcall_HANDLER_process_set_host(&SIMIX_process_self()->simcall, process, dest);
72     return simcall<void, smx_actor_t, sg_host_t>(SIMCALL_PROCESS_SET_HOST, process, dest);
73   }
74
75 inline static int simcall_BODY_process_is_suspended(smx_actor_t process) {
76     /* Go to that function to follow the code flow through the simcall barrier */
77     if (0) SIMIX_process_is_suspended(process);
78     return simcall<int, smx_actor_t>(SIMCALL_PROCESS_IS_SUSPENDED, process);
79   }
80
81 inline static int simcall_BODY_process_join(smx_actor_t process, double timeout) {
82     /* Go to that function to follow the code flow through the simcall barrier */
83     if (0) simcall_HANDLER_process_join(&SIMIX_process_self()->simcall, process, timeout);
84     return simcall<int, smx_actor_t, double>(SIMCALL_PROCESS_JOIN, process, timeout);
85   }
86
87 inline static int simcall_BODY_process_sleep(double duration) {
88     /* Go to that function to follow the code flow through the simcall barrier */
89     if (0) simcall_HANDLER_process_sleep(&SIMIX_process_self()->simcall, duration);
90     return simcall<int, double>(SIMCALL_PROCESS_SLEEP, duration);
91   }
92
93 inline static smx_activity_t simcall_BODY_execution_start(const char* name, double flops_amount, double priority, double bound) {
94     /* Go to that function to follow the code flow through the simcall barrier */
95     if (0) simcall_HANDLER_execution_start(&SIMIX_process_self()->simcall, name, flops_amount, priority, bound);
96     return simcall<smx_activity_t, const char*, double, double, double>(SIMCALL_EXECUTION_START, name, flops_amount, priority, bound);
97   }
98
99 inline static smx_activity_t simcall_BODY_execution_parallel_start(const char* name, int host_nb, sg_host_t* host_list, double* flops_amount, double* bytes_amount, double amount, double rate, double timeout) {
100     /* Go to that function to follow the code flow through the simcall barrier */
101     if (0) SIMIX_execution_parallel_start(name, host_nb, host_list, flops_amount, bytes_amount, amount, rate, timeout);
102     return simcall<smx_activity_t, const char*, int, sg_host_t*, double*, double*, double, double, double>(SIMCALL_EXECUTION_PARALLEL_START, name, host_nb, host_list, flops_amount, bytes_amount, amount, rate, timeout);
103   }
104
105 inline static void simcall_BODY_execution_cancel(smx_activity_t execution) {
106     /* Go to that function to follow the code flow through the simcall barrier */
107     if (0) SIMIX_execution_cancel(execution);
108     return simcall<void, smx_activity_t>(SIMCALL_EXECUTION_CANCEL, execution);
109   }
110
111 inline static void simcall_BODY_execution_set_priority(smx_activity_t execution, double priority) {
112     /* Go to that function to follow the code flow through the simcall barrier */
113     if (0) SIMIX_execution_set_priority(execution, priority);
114     return simcall<void, smx_activity_t, double>(SIMCALL_EXECUTION_SET_PRIORITY, execution, priority);
115   }
116
117 inline static void simcall_BODY_execution_set_bound(smx_activity_t execution, double bound) {
118     /* Go to that function to follow the code flow through the simcall barrier */
119     if (0) SIMIX_execution_set_bound(execution, bound);
120     return simcall<void, smx_activity_t, double>(SIMCALL_EXECUTION_SET_BOUND, execution, bound);
121   }
122
123 inline static int simcall_BODY_execution_wait(smx_activity_t execution) {
124     /* Go to that function to follow the code flow through the simcall barrier */
125     if (0) simcall_HANDLER_execution_wait(&SIMIX_process_self()->simcall, execution);
126     return simcall<int, smx_activity_t>(SIMCALL_EXECUTION_WAIT, execution);
127   }
128
129 inline static void simcall_BODY_process_on_exit(smx_actor_t process, int_f_pvoid_pvoid_t fun, void* data) {
130     /* Go to that function to follow the code flow through the simcall barrier */
131     if (0) SIMIX_process_on_exit(process, fun, data);
132     return simcall<void, smx_actor_t, int_f_pvoid_pvoid_t, void*>(SIMCALL_PROCESS_ON_EXIT, process, fun, data);
133   }
134
135 inline static void simcall_BODY_process_auto_restart_set(smx_actor_t process, int auto_restart) {
136     /* Go to that function to follow the code flow through the simcall barrier */
137     if (0) SIMIX_process_auto_restart_set(process, auto_restart);
138     return simcall<void, smx_actor_t, int>(SIMCALL_PROCESS_AUTO_RESTART_SET, process, auto_restart);
139   }
140
141 inline static smx_actor_t simcall_BODY_process_restart(smx_actor_t process) {
142     /* Go to that function to follow the code flow through the simcall barrier */
143     if (0) simcall_HANDLER_process_restart(&SIMIX_process_self()->simcall, process);
144     return simcall<smx_actor_t, smx_actor_t>(SIMCALL_PROCESS_RESTART, process);
145   }
146
147 inline static smx_activity_t simcall_BODY_comm_iprobe(smx_mailbox_t mbox, int type, int src, int tag, simix_match_func_t match_fun, void* data) {
148     /* Go to that function to follow the code flow through the simcall barrier */
149     if (0) simcall_HANDLER_comm_iprobe(&SIMIX_process_self()->simcall, mbox, type, src, tag, match_fun, data);
150     return simcall<smx_activity_t, smx_mailbox_t, int, int, int, simix_match_func_t, void*>(SIMCALL_COMM_IPROBE, mbox, type, src, tag, match_fun, data);
151   }
152
153 inline static void simcall_BODY_comm_send(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout) {
154     /* Go to that function to follow the code flow through the simcall barrier */
155     if (0) simcall_HANDLER_comm_send(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout);
156     return simcall<void, smx_actor_t, smx_mailbox_t, double, double, void*, size_t, simix_match_func_t, simix_copy_data_func_t, void*, double>(SIMCALL_COMM_SEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, copy_data_fun, data, timeout);
157   }
158
159 inline static smx_activity_t simcall_BODY_comm_isend(smx_actor_t sender, smx_mailbox_t mbox, double task_size, double rate, void* src_buff, size_t src_buff_size, simix_match_func_t match_fun, simix_clean_func_t clean_fun, simix_copy_data_func_t copy_data_fun, void* data, int detached) {
160     /* Go to that function to follow the code flow through the simcall barrier */
161     if (0) simcall_HANDLER_comm_isend(&SIMIX_process_self()->simcall, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached);
162     return simcall<smx_activity_t, smx_actor_t, smx_mailbox_t, double, double, void*, size_t, simix_match_func_t, simix_clean_func_t, simix_copy_data_func_t, void*, int>(SIMCALL_COMM_ISEND, sender, mbox, task_size, rate, src_buff, src_buff_size, match_fun, clean_fun, copy_data_fun, data, detached);
163   }
164
165 inline static void simcall_BODY_comm_recv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double timeout, double rate) {
166     /* Go to that function to follow the code flow through the simcall barrier */
167     if (0) simcall_HANDLER_comm_recv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate);
168     return simcall<void, smx_actor_t, smx_mailbox_t, void*, size_t*, simix_match_func_t, simix_copy_data_func_t, void*, double, double>(SIMCALL_COMM_RECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, timeout, rate);
169   }
170
171 inline static smx_activity_t simcall_BODY_comm_irecv(smx_actor_t receiver, smx_mailbox_t mbox, void* dst_buff, size_t* dst_buff_size, simix_match_func_t match_fun, simix_copy_data_func_t copy_data_fun, void* data, double rate) {
172     /* Go to that function to follow the code flow through the simcall barrier */
173     if (0) simcall_HANDLER_comm_irecv(&SIMIX_process_self()->simcall, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate);
174     return simcall<smx_activity_t, smx_actor_t, smx_mailbox_t, void*, size_t*, simix_match_func_t, simix_copy_data_func_t, void*, double>(SIMCALL_COMM_IRECV, receiver, mbox, dst_buff, dst_buff_size, match_fun, copy_data_fun, data, rate);
175   }
176
177 inline static int simcall_BODY_comm_waitany(xbt_dynar_t comms, double timeout) {
178     /* Go to that function to follow the code flow through the simcall barrier */
179     if (0) simcall_HANDLER_comm_waitany(&SIMIX_process_self()->simcall, comms, timeout);
180     return simcall<int, xbt_dynar_t, double>(SIMCALL_COMM_WAITANY, comms, timeout);
181   }
182
183 inline static void simcall_BODY_comm_wait(smx_activity_t comm, double timeout) {
184     /* Go to that function to follow the code flow through the simcall barrier */
185     if (0) simcall_HANDLER_comm_wait(&SIMIX_process_self()->simcall, comm, timeout);
186     return simcall<void, smx_activity_t, double>(SIMCALL_COMM_WAIT, comm, timeout);
187   }
188
189 inline static int simcall_BODY_comm_test(smx_activity_t comm) {
190     /* Go to that function to follow the code flow through the simcall barrier */
191     if (0) simcall_HANDLER_comm_test(&SIMIX_process_self()->simcall, comm);
192     return simcall<int, smx_activity_t>(SIMCALL_COMM_TEST, comm);
193   }
194
195 inline static int simcall_BODY_comm_testany(smx_activity_t* comms, size_t count) {
196     /* Go to that function to follow the code flow through the simcall barrier */
197     if (0) simcall_HANDLER_comm_testany(&SIMIX_process_self()->simcall, comms, count);
198     return simcall<int, smx_activity_t*, size_t>(SIMCALL_COMM_TESTANY, comms, count);
199   }
200
201 inline static smx_mutex_t simcall_BODY_mutex_init() {
202     /* Go to that function to follow the code flow through the simcall barrier */
203     if (0) simcall_HANDLER_mutex_init(&SIMIX_process_self()->simcall);
204     return simcall<smx_mutex_t>(SIMCALL_MUTEX_INIT);
205   }
206
207 inline static void simcall_BODY_mutex_lock(smx_mutex_t mutex) {
208     /* Go to that function to follow the code flow through the simcall barrier */
209     if (0) simcall_HANDLER_mutex_lock(&SIMIX_process_self()->simcall, mutex);
210     return simcall<void, smx_mutex_t>(SIMCALL_MUTEX_LOCK, mutex);
211   }
212
213 inline static int simcall_BODY_mutex_trylock(smx_mutex_t mutex) {
214     /* Go to that function to follow the code flow through the simcall barrier */
215     if (0) simcall_HANDLER_mutex_trylock(&SIMIX_process_self()->simcall, mutex);
216     return simcall<int, smx_mutex_t>(SIMCALL_MUTEX_TRYLOCK, mutex);
217   }
218
219 inline static void simcall_BODY_mutex_unlock(smx_mutex_t mutex) {
220     /* Go to that function to follow the code flow through the simcall barrier */
221     if (0) simcall_HANDLER_mutex_unlock(&SIMIX_process_self()->simcall, mutex);
222     return simcall<void, smx_mutex_t>(SIMCALL_MUTEX_UNLOCK, mutex);
223   }
224
225 inline static smx_cond_t simcall_BODY_cond_init() {
226     /* Go to that function to follow the code flow through the simcall barrier */
227     if (0) SIMIX_cond_init();
228     return simcall<smx_cond_t>(SIMCALL_COND_INIT);
229   }
230
231 inline static void simcall_BODY_cond_signal(smx_cond_t cond) {
232     /* Go to that function to follow the code flow through the simcall barrier */
233     if (0) SIMIX_cond_signal(cond);
234     return simcall<void, smx_cond_t>(SIMCALL_COND_SIGNAL, cond);
235   }
236
237 inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex) {
238     /* Go to that function to follow the code flow through the simcall barrier */
239     if (0) simcall_HANDLER_cond_wait(&SIMIX_process_self()->simcall, cond, mutex);
240     return simcall<void, smx_cond_t, smx_mutex_t>(SIMCALL_COND_WAIT, cond, mutex);
241   }
242
243 inline static void simcall_BODY_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) {
244     /* Go to that function to follow the code flow through the simcall barrier */
245     if (0) simcall_HANDLER_cond_wait_timeout(&SIMIX_process_self()->simcall, cond, mutex, timeout);
246     return simcall<void, smx_cond_t, smx_mutex_t, double>(SIMCALL_COND_WAIT_TIMEOUT, cond, mutex, timeout);
247   }
248
249 inline static void simcall_BODY_cond_broadcast(smx_cond_t cond) {
250     /* Go to that function to follow the code flow through the simcall barrier */
251     if (0) SIMIX_cond_broadcast(cond);
252     return simcall<void, smx_cond_t>(SIMCALL_COND_BROADCAST, cond);
253   }
254
255 inline static smx_sem_t simcall_BODY_sem_init(unsigned int capacity) {
256     /* Go to that function to follow the code flow through the simcall barrier */
257     if (0) SIMIX_sem_init(capacity);
258     return simcall<smx_sem_t, unsigned int>(SIMCALL_SEM_INIT, capacity);
259   }
260
261 inline static void simcall_BODY_sem_release(smx_sem_t sem) {
262     /* Go to that function to follow the code flow through the simcall barrier */
263     if (0) simcall_HANDLER_sem_release(&SIMIX_process_self()->simcall, sem);
264     return simcall<void, smx_sem_t>(SIMCALL_SEM_RELEASE, sem);
265   }
266
267 inline static int simcall_BODY_sem_would_block(smx_sem_t sem) {
268     /* Go to that function to follow the code flow through the simcall barrier */
269     if (0) simcall_HANDLER_sem_would_block(&SIMIX_process_self()->simcall, sem);
270     return simcall<int, smx_sem_t>(SIMCALL_SEM_WOULD_BLOCK, sem);
271   }
272
273 inline static void simcall_BODY_sem_acquire(smx_sem_t sem) {
274     /* Go to that function to follow the code flow through the simcall barrier */
275     if (0) simcall_HANDLER_sem_acquire(&SIMIX_process_self()->simcall, sem);
276     return simcall<void, smx_sem_t>(SIMCALL_SEM_ACQUIRE, sem);
277   }
278
279 inline static void simcall_BODY_sem_acquire_timeout(smx_sem_t sem, double timeout) {
280     /* Go to that function to follow the code flow through the simcall barrier */
281     if (0) simcall_HANDLER_sem_acquire_timeout(&SIMIX_process_self()->simcall, sem, timeout);
282     return simcall<void, smx_sem_t, double>(SIMCALL_SEM_ACQUIRE_TIMEOUT, sem, timeout);
283   }
284
285 inline static int simcall_BODY_sem_get_capacity(smx_sem_t sem) {
286     /* Go to that function to follow the code flow through the simcall barrier */
287     if (0) simcall_HANDLER_sem_get_capacity(&SIMIX_process_self()->simcall, sem);
288     return simcall<int, smx_sem_t>(SIMCALL_SEM_GET_CAPACITY, sem);
289   }
290
291 inline static sg_size_t simcall_BODY_file_read(smx_file_t fd, sg_size_t size, sg_host_t host) {
292     /* Go to that function to follow the code flow through the simcall barrier */
293     if (0) simcall_HANDLER_file_read(&SIMIX_process_self()->simcall, fd, size, host);
294     return simcall<sg_size_t, smx_file_t, sg_size_t, sg_host_t>(SIMCALL_FILE_READ, fd, size, host);
295   }
296
297 inline static sg_size_t simcall_BODY_file_write(smx_file_t fd, sg_size_t size, sg_host_t host) {
298     /* Go to that function to follow the code flow through the simcall barrier */
299     if (0) simcall_HANDLER_file_write(&SIMIX_process_self()->simcall, fd, size, host);
300     return simcall<sg_size_t, smx_file_t, sg_size_t, sg_host_t>(SIMCALL_FILE_WRITE, fd, size, host);
301   }
302
303 inline static smx_file_t simcall_BODY_file_open(const char* fullpath, sg_host_t host) {
304     /* Go to that function to follow the code flow through the simcall barrier */
305     if (0) simcall_HANDLER_file_open(&SIMIX_process_self()->simcall, fullpath, host);
306     return simcall<smx_file_t, const char*, sg_host_t>(SIMCALL_FILE_OPEN, fullpath, host);
307   }
308
309 inline static int simcall_BODY_file_close(smx_file_t fd, sg_host_t host) {
310     /* Go to that function to follow the code flow through the simcall barrier */
311     if (0) simcall_HANDLER_file_close(&SIMIX_process_self()->simcall, fd, host);
312     return simcall<int, smx_file_t, sg_host_t>(SIMCALL_FILE_CLOSE, fd, host);
313   }
314
315 inline static int simcall_BODY_file_unlink(smx_file_t fd, sg_host_t host) {
316     /* Go to that function to follow the code flow through the simcall barrier */
317     if (0) SIMIX_file_unlink(fd, host);
318     return simcall<int, smx_file_t, sg_host_t>(SIMCALL_FILE_UNLINK, fd, host);
319   }
320
321 inline static sg_size_t simcall_BODY_file_get_size(smx_file_t fd) {
322     /* Go to that function to follow the code flow through the simcall barrier */
323     if (0) simcall_HANDLER_file_get_size(&SIMIX_process_self()->simcall, fd);
324     return simcall<sg_size_t, smx_file_t>(SIMCALL_FILE_GET_SIZE, fd);
325   }
326
327 inline static sg_size_t simcall_BODY_file_tell(smx_file_t fd) {
328     /* Go to that function to follow the code flow through the simcall barrier */
329     if (0) simcall_HANDLER_file_tell(&SIMIX_process_self()->simcall, fd);
330     return simcall<sg_size_t, smx_file_t>(SIMCALL_FILE_TELL, fd);
331   }
332
333 inline static int simcall_BODY_file_seek(smx_file_t fd, sg_offset_t offset, int origin) {
334     /* Go to that function to follow the code flow through the simcall barrier */
335     if (0) simcall_HANDLER_file_seek(&SIMIX_process_self()->simcall, fd, offset, origin);
336     return simcall<int, smx_file_t, sg_offset_t, int>(SIMCALL_FILE_SEEK, fd, offset, origin);
337   }
338
339 inline static xbt_dynar_t simcall_BODY_file_get_info(smx_file_t fd) {
340     /* Go to that function to follow the code flow through the simcall barrier */
341     if (0) simcall_HANDLER_file_get_info(&SIMIX_process_self()->simcall, fd);
342     return simcall<xbt_dynar_t, smx_file_t>(SIMCALL_FILE_GET_INFO, fd);
343   }
344
345 inline static int simcall_BODY_file_move(smx_file_t fd, const char* fullpath) {
346     /* Go to that function to follow the code flow through the simcall barrier */
347     if (0) simcall_HANDLER_file_move(&SIMIX_process_self()->simcall, fd, fullpath);
348     return simcall<int, smx_file_t, const char*>(SIMCALL_FILE_MOVE, fd, fullpath);
349   }
350
351 inline static int simcall_BODY_mc_random(int min, int max) {
352     /* Go to that function to follow the code flow through the simcall barrier */
353     if (0) simcall_HANDLER_mc_random(&SIMIX_process_self()->simcall, min, max);
354     return simcall<int, int, int>(SIMCALL_MC_RANDOM, min, max);
355   }
356
357 inline static void simcall_BODY_set_category(smx_activity_t synchro, const char* category) {
358     /* Go to that function to follow the code flow through the simcall barrier */
359     if (0) SIMIX_set_category(synchro, category);
360     return simcall<void, smx_activity_t, const char*>(SIMCALL_SET_CATEGORY, synchro, category);
361   }
362
363 inline static void simcall_BODY_run_kernel(std::function<void()> const* code) {
364     /* Go to that function to follow the code flow through the simcall barrier */
365     if (0) SIMIX_run_kernel(code);
366     return simcall<void, std::function<void()> const*>(SIMCALL_RUN_KERNEL, code);
367   }
368
369 inline static void simcall_BODY_run_blocking(std::function<void()> const* code) {
370     /* Go to that function to follow the code flow through the simcall barrier */
371     if (0) SIMIX_run_blocking(code);
372     return simcall<void, std::function<void()> const*>(SIMCALL_RUN_BLOCKING, code);
373   }/** @endcond */