From bcffdc2c8881bb840a82e41dd14efa8dce4a9b3c Mon Sep 17 00:00:00 2001 From: Marcus Tomlinson Date: Sat, 10 Aug 2024 16:08:18 +0100 Subject: [PATCH] 11.3.0 --- CHANGES | 6 + docs/Doxyfile | 2 +- docs/html/_circuit_8h_source.html | 1320 +++++++++-------- docs/html/_component_8h_source.html | 32 +- docs/html/_d_s_patch_8h_source.html | 28 +- docs/html/_plugin_8h_source.html | 46 +- docs/html/_signal_bus_8h_source.html | 32 +- docs/html/annotated.html | 32 +- .../class_d_s_patch_1_1_circuit-members.html | 28 +- docs/html/class_d_s_patch_1_1_circuit.html | 167 +-- ...class_d_s_patch_1_1_component-members.html | 28 +- docs/html/class_d_s_patch_1_1_component.html | 171 +-- .../class_d_s_patch_1_1_plugin-members.html | 28 +- docs/html/class_d_s_patch_1_1_plugin.html | 49 +- ...lass_d_s_patch_1_1_signal_bus-members.html | 28 +- docs/html/class_d_s_patch_1_1_signal_bus.html | 130 +- docs/html/classes.html | 28 +- docs/html/clipboard.js | 61 + docs/html/cookie.js | 58 + .../dir_96ae4afe4ae1b3c2e5b248f6fc6b60cd.html | 28 +- .../dir_d44c64559bbebec7f509842c48db8b23.html | 28 +- docs/html/doxygen.css | 303 +++- docs/html/doxygen_crawl.html | 52 + docs/html/dynsections.js | 257 ++-- docs/html/files.html | 34 +- docs/html/index.html | 31 +- docs/html/menu.js | 38 +- docs/html/minus.svg | 8 + docs/html/minusd.svg | 8 + docs/html/navtree.css | 149 ++ docs/html/plus.svg | 9 + docs/html/plusd.svg | 9 + docs/html/resize.js | 145 ++ docs/html/search/all_0.js | 3 +- docs/html/search/all_1.js | 2 +- docs/html/search/all_2.js | 3 +- docs/html/search/all_3.js | 2 +- docs/html/search/all_4.js | 7 +- docs/html/search/all_5.js | 2 +- docs/html/search/all_6.js | 5 + docs/html/search/all_7.js | 4 + docs/html/search/all_8.js | 4 + docs/html/search/all_9.js | 4 + docs/html/search/all_a.js | 4 + docs/html/search/all_b.js | 6 + docs/html/search/all_c.js | 5 + docs/html/search/pages_0.js | 2 +- docs/html/search/pages_1.js | 4 + docs/html/search/pages_2.js | 4 + docs/html/search/pages_3.js | 4 + docs/html/search/pages_4.js | 4 + docs/html/search/pages_5.js | 4 + docs/html/search/search.js | 934 +++++------- docs/html/search/searchdata.js | 4 +- docs/html/tabs.css | 2 +- include/fast_any | 2 +- 56 files changed, 2675 insertions(+), 1713 deletions(-) create mode 100644 docs/html/clipboard.js create mode 100644 docs/html/cookie.js create mode 100644 docs/html/doxygen_crawl.html create mode 100644 docs/html/minus.svg create mode 100644 docs/html/minusd.svg create mode 100644 docs/html/navtree.css create mode 100644 docs/html/plus.svg create mode 100644 docs/html/plusd.svg create mode 100644 docs/html/resize.js create mode 100644 docs/html/search/all_6.js create mode 100644 docs/html/search/all_7.js create mode 100644 docs/html/search/all_8.js create mode 100644 docs/html/search/all_9.js create mode 100644 docs/html/search/all_a.js create mode 100644 docs/html/search/all_b.js create mode 100644 docs/html/search/all_c.js create mode 100644 docs/html/search/pages_1.js create mode 100644 docs/html/search/pages_2.js create mode 100644 docs/html/search/pages_3.js create mode 100644 docs/html/search/pages_4.js create mode 100644 docs/html/search/pages_5.js diff --git a/CHANGES b/CHANGES index 59ebb0c1..0f0b3a0d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +v.11.3.0 (10 August 2024) + - Updated fast_any submodule (incl. uninitialized type_id fix). + - Simplified conditionals in Circuit::Tick(). + - Slightly optimized Circuit::Optimize() method. + - Reduced conditionals in circuit thread while loops. + v.11.2.0 (05 April 2024) - Updated fast_any submodule (incl. README update). - Renamed _ReleaseNextThread() to _ReleaseNextBuffer(). diff --git a/docs/Doxyfile b/docs/Doxyfile index 5acb5819..b86733e4 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -32,7 +32,7 @@ PROJECT_NAME = DSPatch # This could be handy for archiving the generated documentation or # if some version control system is used. -PROJECT_NUMBER = v.11.2.0 +PROJECT_NUMBER = v.11.3.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer diff --git a/docs/html/_circuit_8h_source.html b/docs/html/_circuit_8h_source.html index 3e56450b..4e5b6c41 100644 --- a/docs/html/_circuit_8h_source.html +++ b/docs/html/_circuit_8h_source.html @@ -3,12 +3,16 @@ - + DSPatch: Circuit.h Source File + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
Circuit.h
@@ -124,6 +139,7 @@
45{
46
48
+
72class Circuit final
73{
74public:
@@ -195,690 +211,700 @@
140 inline void Stop()
141 {
142 _stop = true;
-
143
-
144 if ( _thread.joinable() )
-
145 {
-
146 _thread.join();
-
147 }
-
148 }
-
149
-
150 inline void Pause()
-
151 {
-
152 if ( !_stopped && ++pauseCount == 1 )
-
153 {
-
154 std::unique_lock<std::mutex> lock( _resumeMutex );
-
155 _pause = true;
-
156 _pauseCondt.wait( lock ); // wait for pause
-
157 }
-
158 }
-
159
-
160 inline void Resume()
-
161 {
-
162 if ( _pause && --pauseCount == 0 )
-
163 {
-
164 _pause = false;
-
165 _resumeCondt.notify_all();
-
166 std::this_thread::yield();
-
167 }
-
168 }
-
169
-
170 private:
-
171 inline void _Run()
-
172 {
-
173 if ( _circuit )
-
174 {
-
175 while ( !_stop )
-
176 {
-
177 _circuit->Tick();
-
178
-
179 if ( _pause )
-
180 {
-
181 std::unique_lock<std::mutex> lock( _resumeMutex );
-
182
-
183 _pauseCondt.notify_all();
-
184 _resumeCondt.wait( lock ); // wait for resume
-
185 }
-
186 }
-
187 }
+
143 _pause = true;
+
144
+
145 if ( _thread.joinable() )
+
146 {
+
147 _thread.join();
+
148 }
+
149 }
+
150
+
151 inline void Pause()
+
152 {
+
153 if ( !_stopped && ++pauseCount == 1 )
+
154 {
+
155 std::unique_lock<std::mutex> lock( _resumeMutex );
+
156 _pause = true;
+
157 _pauseCondt.wait( lock ); // wait for pause
+
158 }
+
159 }
+
160
+
161 inline void Resume()
+
162 {
+
163 if ( _pause && --pauseCount == 0 )
+
164 {
+
165 _pause = false;
+
166 _resumeCondt.notify_all();
+
167 std::this_thread::yield();
+
168 }
+
169 }
+
170
+
171 private:
+
172 inline void _Run()
+
173 {
+
174 if ( _circuit )
+
175 {
+
176 while ( true )
+
177 {
+
178 _circuit->Tick();
+
179
+
180 if ( _pause )
+
181 {
+
182 if ( _stop )
+
183 {
+
184 break;
+
185 }
+
186
+
187 std::unique_lock<std::mutex> lock( _resumeMutex );
188
-
189 _stopped = true;
-
190 }
-
191
-
192 std::thread _thread;
-
193 DSPatch::Circuit* _circuit = nullptr;
-
194 int pauseCount = 0;
-
195 bool _stop = false;
-
196 bool _pause = false;
-
197 bool _stopped = true;
-
198 std::mutex _resumeMutex;
-
199 std::condition_variable _resumeCondt, _pauseCondt;
-
200 };
-
201
-
202 class CircuitThread final
-
203 {
-
204 public:
-
205 CircuitThread( const CircuitThread& ) = delete;
-
206 CircuitThread& operator=( const CircuitThread& ) = delete;
+
189 _pauseCondt.notify_all();
+
190 _resumeCondt.wait( lock ); // wait for resume
+
191 }
+
192 }
+
193 }
+
194
+
195 _stopped = true;
+
196 }
+
197
+
198 std::thread _thread;
+
199 DSPatch::Circuit* _circuit = nullptr;
+
200 int pauseCount = 0;
+
201 bool _stop = false;
+
202 bool _pause = false;
+
203 bool _stopped = true;
+
204 std::mutex _resumeMutex;
+
205 std::condition_variable _resumeCondt, _pauseCondt;
+
206 };
207
-
208 inline CircuitThread() = default;
-
209
-
210 // cppcheck-suppress missingMemberCopy
-
211 inline CircuitThread( CircuitThread&& )
-
212 {
-
213 }
-
214
-
215 inline ~CircuitThread()
-
216 {
-
217 Stop();
-
218 }
-
219
-
220 inline void Start( std::vector<DSPatch::Component*>* components, int bufferNo )
-
221 {
-
222 _components = components;
-
223 _bufferNo = bufferNo;
-
224
-
225 _stop = false;
-
226 _gotSync = false;
-
227
-
228 _thread = std::thread( &CircuitThread::_Run, this );
-
229 }
+
208 class CircuitThread final
+
209 {
+
210 public:
+
211 CircuitThread( const CircuitThread& ) = delete;
+
212 CircuitThread& operator=( const CircuitThread& ) = delete;
+
213
+
214 inline CircuitThread() = default;
+
215
+
216 // cppcheck-suppress missingMemberCopy
+
217 inline CircuitThread( CircuitThread&& )
+
218 {
+
219 }
+
220
+
221 inline ~CircuitThread()
+
222 {
+
223 Stop();
+
224 }
+
225
+
226 inline void Start( std::vector<DSPatch::Component*>* components, int bufferNo )
+
227 {
+
228 _components = components;
+
229 _bufferNo = bufferNo;
230
-
231 inline void Stop()
-
232 {
-
233 _stop = true;
-
234
-
235 Resume();
+
231 _stop = false;
+
232 _gotSync = false;
+
233
+
234 _thread = std::thread( &CircuitThread::_Run, this );
+
235 }
236
-
237 if ( _thread.joinable() )
-
238 {
-
239 _thread.join();
-
240 }
-
241 }
+
237 inline void Stop()
+
238 {
+
239 _stop = true;
+
240
+
241 Resume();
242
-
243 inline void Sync()
-
244 {
-
245 std::unique_lock<std::mutex> lock( _syncMutex );
-
246
-
247 if ( !_gotSync ) // if haven't already got sync
-
248 {
-
249 _syncCondt.wait( lock ); // wait for sync
-
250 }
-
251 }
+
243 if ( _thread.joinable() )
+
244 {
+
245 _thread.join();
+
246 }
+
247 }
+
248
+
249 inline void Sync()
+
250 {
+
251 std::unique_lock<std::mutex> lock( _syncMutex );
252
-
253 inline void Resume()
-
254 {
-
255 _gotSync = false; // reset the sync flag
-
256 _resumeCondt.notify_all();
-
257 std::this_thread::yield();
-
258 }
-
259
-
260 inline void SyncAndResume()
-
261 {
-
262 Sync();
-
263 Resume();
+
253 if ( !_gotSync ) // if haven't already got sync
+
254 {
+
255 _syncCondt.wait( lock ); // wait for sync
+
256 }
+
257 }
+
258
+
259 inline void Resume()
+
260 {
+
261 _gotSync = false; // reset the sync flag
+
262 _resumeCondt.notify_all();
+
263 std::this_thread::yield();
264 }
265
-
266 private:
-
267 inline void _Run()
-
268 {
-
269#ifdef _WIN32
-
270 SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
-
271#else
-
272 sched_param sch_params;
-
273 sch_params.sched_priority = sched_get_priority_max( SCHED_RR );
-
274 pthread_setschedparam( pthread_self(), SCHED_RR, &sch_params );
-
275#endif
-
276
-
277 if ( _components )
-
278 {
-
279 while ( !_stop )
-
280 {
-
281 {
-
282 std::unique_lock<std::mutex> lock( _syncMutex );
-
283
-
284 _gotSync = true; // set the sync flag
-
285 _syncCondt.notify_all();
-
286 _resumeCondt.wait( lock ); // wait for resume
-
287 }
-
288
-
289 // cppcheck-suppress knownConditionTrueFalse
-
290 if ( !_stop )
-
291 {
-
292 // You might be thinking: Can't we have each thread start on a different component?
-
293
-
294 // Well no. In order to maintain synchronisation within the circuit, when a component
-
295 // wants to process its buffers in-order, it requires that every other in-order
-
296 // component in the system has not only processed its buffers in the same order, but
-
297 // has processed the same number of buffers too.
-
298
-
299 // E.g. 1,2,3 and 1,2,3. Not 1,2,3 and 2,3,1,2,3.
-
300
-
301 for ( auto component : *_components )
-
302 {
-
303 component->Tick( _bufferNo );
-
304 }
-
305 }
-
306 }
-
307 }
-
308 }
-
309
-
310 std::thread _thread;
-
311 std::vector<DSPatch::Component*>* _components = nullptr;
-
312 int _bufferNo = 0;
-
313 bool _stop = false;
-
314 bool _gotSync = false;
-
315 std::mutex _syncMutex;
-
316 std::condition_variable _resumeCondt, _syncCondt;
-
317 };
-
318
-
319 class CircuitThreadParallel final
-
320 {
-
321 public:
-
322 CircuitThreadParallel( const CircuitThreadParallel& ) = delete;
-
323 CircuitThreadParallel& operator=( const CircuitThreadParallel& ) = delete;
-
324
-
325 inline CircuitThreadParallel() = default;
-
326
-
327 // cppcheck-suppress missingMemberCopy
-
328 inline CircuitThreadParallel( CircuitThreadParallel&& )
-
329 {
-
330 }
+
266 inline void SyncAndResume()
+
267 {
+
268 Sync();
+
269 Resume();
+
270 }
+
271
+
272 private:
+
273 inline void _Run()
+
274 {
+
275#ifdef _WIN32
+
276 SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
+
277#else
+
278 sched_param sch_params;
+
279 sch_params.sched_priority = sched_get_priority_max( SCHED_RR );
+
280 pthread_setschedparam( pthread_self(), SCHED_RR, &sch_params );
+
281#endif
+
282
+
283 if ( _components )
+
284 {
+
285 while ( true )
+
286 {
+
287 {
+
288 std::unique_lock<std::mutex> lock( _syncMutex );
+
289
+
290 _gotSync = true; // set the sync flag
+
291 _syncCondt.notify_all();
+
292 _resumeCondt.wait( lock ); // wait for resume
+
293 }
+
294
+
295 if ( _stop )
+
296 {
+
297 break;
+
298 }
+
299
+
300 // You might be thinking: Can't we have each thread start on a different component?
+
301
+
302 // Well no. In order to maintain synchronisation within the circuit, when a component
+
303 // wants to process its buffers in-order, it requires that every other in-order
+
304 // component in the system has not only processed its buffers in the same order, but
+
305 // has processed the same number of buffers too.
+
306
+
307 // E.g. 1,2,3 and 1,2,3. Not 1,2,3 and 2,3,1,2,3.
+
308
+
309 for ( auto component : *_components )
+
310 {
+
311 component->Tick( _bufferNo );
+
312 }
+
313 }
+
314 }
+
315 }
+
316
+
317 std::thread _thread;
+
318 std::vector<DSPatch::Component*>* _components = nullptr;
+
319 int _bufferNo = 0;
+
320 bool _stop = false;
+
321 bool _gotSync = false;
+
322 std::mutex _syncMutex;
+
323 std::condition_variable _resumeCondt, _syncCondt;
+
324 };
+
325
+
326 class CircuitThreadParallel final
+
327 {
+
328 public:
+
329 CircuitThreadParallel( const CircuitThreadParallel& ) = delete;
+
330 CircuitThreadParallel& operator=( const CircuitThreadParallel& ) = delete;
331
-
332 inline ~CircuitThreadParallel()
-
333 {
-
334 Stop();
-
335 }
-
336
-
337 inline void Start( std::vector<DSPatch::Component*>* components, int bufferNo, int threadNo, int threadCount )
-
338 {
-
339 _components = components;
-
340 _bufferNo = bufferNo;
-
341 _threadNo = threadNo;
-
342 _threadCount = threadCount;
+
332 inline CircuitThreadParallel() = default;
+
333
+
334 // cppcheck-suppress missingMemberCopy
+
335 inline CircuitThreadParallel( CircuitThreadParallel&& )
+
336 {
+
337 }
+
338
+
339 inline ~CircuitThreadParallel()
+
340 {
+
341 Stop();
+
342 }
343
-
344 _stop = false;
-
345 _gotSync = false;
-
346
-
347 _thread = std::thread( &CircuitThreadParallel::_Run, this );
-
348 }
-
349
-
350 inline void Stop()
-
351 {
-
352 _stop = true;
+
344 inline void Start( std::vector<DSPatch::Component*>* components, int bufferNo, int threadNo, int threadCount )
+
345 {
+
346 _components = components;
+
347 _bufferNo = bufferNo;
+
348 _threadNo = threadNo;
+
349 _threadCount = threadCount;
+
350
+
351 _stop = false;
+
352 _gotSync = false;
353
-
354 Resume();
-
355
-
356 if ( _thread.joinable() )
-
357 {
-
358 _thread.join();
-
359 }
-
360 }
-
361
-
362 inline void Sync()
-
363 {
-
364 std::unique_lock<std::mutex> lock( _syncMutex );
-
365
-
366 if ( !_gotSync ) // if haven't already got sync
-
367 {
-
368 _syncCondt.wait( lock ); // wait for sync
-
369 }
-
370 }
-
371
-
372 inline void Resume()
-
373 {
-
374 _gotSync = false; // reset the sync flag
-
375 _resumeCondt.notify_all();
-
376 std::this_thread::yield();
+
354 _thread = std::thread( &CircuitThreadParallel::_Run, this );
+
355 }
+
356
+
357 inline void Stop()
+
358 {
+
359 _stop = true;
+
360
+
361 Resume();
+
362
+
363 if ( _thread.joinable() )
+
364 {
+
365 _thread.join();
+
366 }
+
367 }
+
368
+
369 inline void Sync()
+
370 {
+
371 std::unique_lock<std::mutex> lock( _syncMutex );
+
372
+
373 if ( !_gotSync ) // if haven't already got sync
+
374 {
+
375 _syncCondt.wait( lock ); // wait for sync
+
376 }
377 }
378
-
379 private:
-
380 inline void _Run()
-
381 {
-
382#ifdef _WIN32
-
383 SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
-
384#else
-
385 sched_param sch_params;
-
386 sch_params.sched_priority = sched_get_priority_max( SCHED_RR );
-
387 pthread_setschedparam( pthread_self(), SCHED_RR, &sch_params );
-
388#endif
-
389
-
390 if ( _components )
-
391 {
-
392 while ( !_stop )
-
393 {
-
394 {
-
395 std::unique_lock<std::mutex> lock( _syncMutex );
+
379 inline void Resume()
+
380 {
+
381 _gotSync = false; // reset the sync flag
+
382 _resumeCondt.notify_all();
+
383 std::this_thread::yield();
+
384 }
+
385
+
386 private:
+
387 inline void _Run()
+
388 {
+
389#ifdef _WIN32
+
390 SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST );
+
391#else
+
392 sched_param sch_params;
+
393 sch_params.sched_priority = sched_get_priority_max( SCHED_RR );
+
394 pthread_setschedparam( pthread_self(), SCHED_RR, &sch_params );
+
395#endif
396
-
397 _gotSync = true; // set the sync flag
-
398 _syncCondt.notify_all();
-
399 _resumeCondt.wait( lock ); // wait for resume
-
400 }
-
401
-
402 // cppcheck-suppress knownConditionTrueFalse
-
403 if ( !_stop )
-
404 {
-
405 for ( auto it = _components->begin() + _threadNo; it < _components->end(); it += _threadCount )
-
406 {
-
407 ( *it )->TickParallel( _bufferNo );
-
408 }
-
409 }
-
410 }
-
411 }
-
412 }
+
397 if ( _components )
+
398 {
+
399 while ( true )
+
400 {
+
401 {
+
402 std::unique_lock<std::mutex> lock( _syncMutex );
+
403
+
404 _gotSync = true; // set the sync flag
+
405 _syncCondt.notify_all();
+
406 _resumeCondt.wait( lock ); // wait for resume
+
407 }
+
408
+
409 if ( _stop )
+
410 {
+
411 break;
+
412 }
413
-
414 std::thread _thread;
-
415 std::vector<DSPatch::Component*>* _components = nullptr;
-
416 int _bufferNo = 0;
-
417 int _threadNo = 0;
-
418 int _threadCount = 0;
-
419 bool _stop = false;
-
420 bool _gotSync = false;
-
421 std::mutex _syncMutex;
-
422 std::condition_variable _resumeCondt, _syncCondt;
-
423 };
-
424
-
425 void _Optimize();
-
426
-
427 int _bufferCount = 0;
-
428 int _threadCount = 0;
-
429 int _currentBuffer = 0;
-
430
-
431 AutoTickThread _autoTickThread;
+
414 for ( auto it = _components->begin() + _threadNo; it < _components->end(); it += _threadCount )
+
415 {
+
416 ( *it )->TickParallel( _bufferNo );
+
417 }
+
418 }
+
419 }
+
420 }
+
421
+
422 std::thread _thread;
+
423 std::vector<DSPatch::Component*>* _components = nullptr;
+
424 int _bufferNo = 0;
+
425 int _threadNo = 0;
+
426 int _threadCount = 0;
+
427 bool _stop = false;
+
428 bool _gotSync = false;
+
429 std::mutex _syncMutex;
+
430 std::condition_variable _resumeCondt, _syncCondt;
+
431 };
432
-
433 std::set<DSPatch::Component::SPtr> _componentsSet;
+
433 void _Optimize();
434
-
435 std::vector<DSPatch::Component*> _components;
-
436 std::vector<DSPatch::Component*> _componentsParallel;
-
437
-
438 std::vector<CircuitThread> _circuitThreads;
-
439 std::vector<std::vector<CircuitThreadParallel>> _circuitThreadsParallel;
+
435 int _bufferCount = 0;
+
436 int _threadCount = 0;
+
437 int _currentBuffer = 0;
+
438
+
439 AutoTickThread _autoTickThread;
440
-
441 bool _circuitDirty = false;
-
442};
-
443
-
444inline Circuit::Circuit() = default;
+
441 std::set<DSPatch::Component::SPtr> _componentsSet;
+
442
+
443 std::vector<DSPatch::Component*> _components;
+
444 std::vector<DSPatch::Component*> _componentsParallel;
445
-
446inline Circuit::~Circuit()
-
447{
-
448 StopAutoTick();
-
449 DisconnectAllComponents();
-
450}
+
446 std::vector<CircuitThread> _circuitThreads;
+
447 std::vector<std::vector<CircuitThreadParallel>> _circuitThreadsParallel;
+
448
+
449 bool _circuitDirty = false;
+
450};
+
451
-
452inline bool Circuit::AddComponent( const Component::SPtr& component )
-
453{
-
454 if ( !component || _componentsSet.find( component ) != _componentsSet.end() )
-
455 {
-
456 return false;
-
457 }
-
458
-
459 // components within the circuit need to have as many buffers as there are threads in the circuit
-
460 component->SetBufferCount( _bufferCount, _currentBuffer );
-
461
-
462 PauseAutoTick();
-
463 _components.emplace_back( component.get() );
-
464 _componentsParallel.emplace_back( component.get() );
-
465 ResumeAutoTick();
+
452inline Circuit::Circuit() = default;
+
453
+
454inline Circuit::~Circuit()
+
455{
+
456 StopAutoTick();
+
457 DisconnectAllComponents();
+
458}
+
459
+
460inline bool Circuit::AddComponent( const Component::SPtr& component )
+
461{
+
462 if ( !component || _componentsSet.find( component ) != _componentsSet.end() )
+
463 {
+
464 return false;
+
465 }
466
-
467 _componentsSet.emplace( component );
-
468
-
469 return true;
-
470}
-
471
-
472inline bool Circuit::RemoveComponent( const Component::SPtr& component )
-
473{
-
474 if ( _componentsSet.find( component ) == _componentsSet.end() )
-
475 {
-
476 return false;
-
477 }
-
478
-
479 auto findFn = [&component]( auto comp ) { return comp == component.get(); };
-
480
-
481 if ( auto it = std::find_if( _components.begin(), _components.end(), findFn ); it != _components.end() )
-
482 {
-
483 PauseAutoTick();
-
484
-
485 DisconnectComponent( component );
+
467 // components within the circuit need to have as many buffers as there are threads in the circuit
+
468 component->SetBufferCount( _bufferCount, _currentBuffer );
+
469
+
470 PauseAutoTick();
+
471 _components.emplace_back( component.get() );
+
472 _componentsParallel.emplace_back( component.get() );
+
473 ResumeAutoTick();
+
474
+
475 _componentsSet.emplace( component );
+
476
+
477 return true;
+
478}
+
479
+
480inline bool Circuit::RemoveComponent( const Component::SPtr& component )
+
481{
+
482 if ( _componentsSet.find( component ) == _componentsSet.end() )
+
483 {
+
484 return false;
+
485 }
486
-
487 _components.erase( it );
+
487 auto findFn = [&component]( auto comp ) { return comp == component.get(); };
488
-
489 ResumeAutoTick();
-
490
-
491 _componentsSet.erase( component );
+
489 if ( auto it = std::find_if( _components.begin(), _components.end(), findFn ); it != _components.end() )
+
490 {
+
491 PauseAutoTick();
492
-
493 return true;
-
494 }
-
495
-
496 return false;
-
497}
+
493 DisconnectComponent( component );
+
494
+
495 _components.erase( it );
+
496
+
497 ResumeAutoTick();
498
-
499// cppcheck-suppress unusedFunction
-
500inline void Circuit::RemoveAllComponents()
-
501{
-
502 PauseAutoTick();
+
499 _componentsSet.erase( component );
+
500
+
501 return true;
+
502 }
503
-
504 DisconnectAllComponents();
-
505
-
506 _components.clear();
-
507 _componentsParallel.clear();
-
508
-
509 ResumeAutoTick();
-
510
-
511 _componentsSet.clear();
-
512}
+
504 return false;
+
505}
+
506
+
507// cppcheck-suppress unusedFunction
+
508inline void Circuit::RemoveAllComponents()
+
509{
+
510 PauseAutoTick();
+
511
+
512 DisconnectAllComponents();
513
-
514inline int Circuit::GetComponentCount() const
-
515{
-
516 return (int)_components.size();
-
517}
+
514 _components.clear();
+
515 _componentsParallel.clear();
+
516
+
517 ResumeAutoTick();
518
-
519inline bool Circuit::ConnectOutToIn( const Component::SPtr& fromComponent,
-
520 int fromOutput,
-
521 const Component::SPtr& toComponent,
-
522 int toInput )
-
523{
-
524 if ( _componentsSet.find( fromComponent ) == _componentsSet.end() ||
-
525 _componentsSet.find( toComponent ) == _componentsSet.end() )
-
526 {
-
527 return false;
-
528 }
-
529
-
530 PauseAutoTick();
-
531
-
532 bool result = toComponent->ConnectInput( fromComponent, fromOutput, toInput );
-
533
-
534 _circuitDirty = result;
-
535
-
536 ResumeAutoTick();
+
519 _componentsSet.clear();
+
520}
+
521
+
522inline int Circuit::GetComponentCount() const
+
523{
+
524 return (int)_components.size();
+
525}
+
526
+
527inline bool Circuit::ConnectOutToIn( const Component::SPtr& fromComponent,
+
528 int fromOutput,
+
529 const Component::SPtr& toComponent,
+
530 int toInput )
+
531{
+
532 if ( _componentsSet.find( fromComponent ) == _componentsSet.end() ||
+
533 _componentsSet.find( toComponent ) == _componentsSet.end() )
+
534 {
+
535 return false;
+
536 }
537
-
538 return result;
-
539}
-
540
-
541inline bool Circuit::DisconnectComponent( const Component::SPtr& component )
-
542{
-
543 if ( _componentsSet.find( component ) == _componentsSet.end() )
-
544 {
-
545 return false;
-
546 }
-
547
-
548 PauseAutoTick();
-
549
-
550 component->DisconnectAllInputs();
-
551
-
552 // remove any connections this component has to other components
-
553 for ( auto comp : _components )
-
554 {
-
555 comp->DisconnectInput( component );
-
556 }
+
538 PauseAutoTick();
+
539
+
540 bool result = toComponent->ConnectInput( fromComponent, fromOutput, toInput );
+
541
+
542 _circuitDirty = result;
+
543
+
544 ResumeAutoTick();
+
545
+
546 return result;
+
547}
+
548
+
549inline bool Circuit::DisconnectComponent( const Component::SPtr& component )
+
550{
+
551 if ( _componentsSet.find( component ) == _componentsSet.end() )
+
552 {
+
553 return false;
+
554 }
+
555
+
556 PauseAutoTick();
557
-
558 _circuitDirty = true;
+
558 component->DisconnectAllInputs();
559
-
560 ResumeAutoTick();
-
561
-
562 return true;
-
563}
-
564
-
565inline void Circuit::DisconnectAllComponents()
-
566{
-
567 PauseAutoTick();
-
568
-
569 for ( auto component : _components )
-
570 {
-
571 component->DisconnectAllInputs();
-
572 }
-
573
-
574 ResumeAutoTick();
-
575}
+
560 // remove any connections this component has to other components
+
561 for ( auto comp : _components )
+
562 {
+
563 comp->DisconnectInput( component );
+
564 }
+
565
+
566 _circuitDirty = true;
+
567
+
568 ResumeAutoTick();
+
569
+
570 return true;
+
571}
+
572
+
573inline void Circuit::DisconnectAllComponents()
+
574{
+
575 PauseAutoTick();
576
-
577inline void Circuit::SetBufferCount( int bufferCount )
-
578{
-
579 PauseAutoTick();
-
580
-
581 _bufferCount = bufferCount;
-
582
-
583 // stop all threads
-
584 for ( auto& circuitThread : _circuitThreads )
-
585 {
-
586 circuitThread.Stop();
-
587 }
+
577 for ( auto component : _components )
+
578 {
+
579 component->DisconnectAllInputs();
+
580 }
+
581
+
582 ResumeAutoTick();
+
583}
+
584
+
585inline void Circuit::SetBufferCount( int bufferCount )
+
586{
+
587 PauseAutoTick();
588
-
589 // resize thread array
-
590 if ( _threadCount != 0 )
-
591 {
-
592 _circuitThreads.resize( 0 );
-
593 SetThreadCount( _threadCount );
-
594 }
-
595 else
-
596 {
-
597 _circuitThreads.resize( _bufferCount );
-
598
-
599 // initialise and start all threads
-
600 for ( int i = 0; i < _bufferCount; ++i )
-
601 {
-
602 _circuitThreads[i].Start( &_components, i );
-
603 }
-
604 }
-
605
-
606 if ( _currentBuffer >= _bufferCount )
-
607 {
-
608 _currentBuffer = 0;
-
609 }
-
610
-
611 // set all components to the new buffer count
-
612 for ( auto component : _components )
-
613 {
-
614 component->SetBufferCount( _bufferCount, _currentBuffer );
-
615 }
-
616
-
617 ResumeAutoTick();
-
618}
-
619
-
620inline int Circuit::GetBufferCount() const
-
621{
-
622 return _bufferCount;
-
623}
+
589 _bufferCount = bufferCount;
+
590
+
591 // stop all threads
+
592 for ( auto& circuitThread : _circuitThreads )
+
593 {
+
594 circuitThread.Stop();
+
595 }
+
596
+
597 // resize thread array
+
598 if ( _threadCount != 0 )
+
599 {
+
600 _circuitThreads.resize( 0 );
+
601 SetThreadCount( _threadCount );
+
602 }
+
603 else
+
604 {
+
605 _circuitThreads.resize( _bufferCount );
+
606
+
607 // initialise and start all threads
+
608 for ( int i = 0; i < _bufferCount; ++i )
+
609 {
+
610 _circuitThreads[i].Start( &_components, i );
+
611 }
+
612 }
+
613
+
614 if ( _currentBuffer >= _bufferCount )
+
615 {
+
616 _currentBuffer = 0;
+
617 }
+
618
+
619 // set all components to the new buffer count
+
620 for ( auto component : _components )
+
621 {
+
622 component->SetBufferCount( _bufferCount, _currentBuffer );
+
623 }
624
-
625inline void Circuit::SetThreadCount( int threadCount )
-
626{
-
627 PauseAutoTick();
-
628
-
629 if ( _threadCount == 0 && threadCount != 0 )
-
630 {
-
631 _circuitDirty = true;
-
632 }
-
633
-
634 _threadCount = threadCount;
-
635
-
636 // stop all threads
-
637 for ( auto& circuitThreads : _circuitThreadsParallel )
+
625 ResumeAutoTick();
+
626}
+
627
+
628inline int Circuit::GetBufferCount() const
+
629{
+
630 return _bufferCount;
+
631}
+
632
+
633inline void Circuit::SetThreadCount( int threadCount )
+
634{
+
635 PauseAutoTick();
+
636
+
637 if ( _threadCount == 0 && threadCount != 0 )
638 {
-
639 for ( auto& circuitThread : circuitThreads )
-
640 {
-
641 circuitThread.Stop();
-
642 }
-
643 }
-
644
-
645 // resize thread array
-
646 if ( _threadCount == 0 )
-
647 {
-
648 _circuitThreadsParallel.resize( 0 );
-
649 SetBufferCount( _bufferCount );
-
650 }
-
651 else
-
652 {
-
653 _circuitThreadsParallel.resize( _bufferCount == 0 ? 1 : _bufferCount );
-
654 for ( auto& circuitThread : _circuitThreadsParallel )
-
655 {
-
656 circuitThread.resize( _threadCount );
-
657 }
-
658
-
659 // initialise and start all threads
-
660 int i = 0;
-
661 for ( auto& circuitThreads : _circuitThreadsParallel )
-
662 {
-
663 int j = 0;
-
664 for ( auto& circuitThread : circuitThreads )
-
665 {
-
666 circuitThread.Start( &_componentsParallel, i, j++, _threadCount );
-
667 }
-
668 ++i;
-
669 }
-
670 }
-
671
-
672 ResumeAutoTick();
-
673}
-
674
-
675// cppcheck-suppress unusedFunction
-
676inline int Circuit::GetThreadCount() const
-
677{
-
678 return _threadCount;
-
679}
-
680
-
681inline void Circuit::Tick()
-
682{
-
683 if ( _circuitDirty )
-
684 {
-
685 _Optimize();
-
686 }
-
687
-
688 // process in a single thread if this circuit has no threads
-
689 // =========================================================
-
690 if ( _bufferCount == 0 && _threadCount == 0 )
-
691 {
-
692 // tick all internal components
-
693 for ( auto component : _components )
-
694 {
-
695 component->Tick( 0 );
-
696 }
-
697
-
698 return;
-
699 }
-
700 // process in multiple threads if this circuit has threads
-
701 // =======================================================
-
702 else if ( _threadCount != 0 )
-
703 {
-
704 auto& circuitThreads = _circuitThreadsParallel[_currentBuffer];
-
705
+
639 _circuitDirty = true;
+
640 }
+
641
+
642 _threadCount = threadCount;
+
643
+
644 // stop all threads
+
645 for ( auto& circuitThreads : _circuitThreadsParallel )
+
646 {
+
647 for ( auto& circuitThread : circuitThreads )
+
648 {
+
649 circuitThread.Stop();
+
650 }
+
651 }
+
652
+
653 // resize thread array
+
654 if ( _threadCount == 0 )
+
655 {
+
656 _circuitThreadsParallel.resize( 0 );
+
657 SetBufferCount( _bufferCount );
+
658 }
+
659 else
+
660 {
+
661 _circuitThreadsParallel.resize( _bufferCount == 0 ? 1 : _bufferCount );
+
662 for ( auto& circuitThread : _circuitThreadsParallel )
+
663 {
+
664 circuitThread.resize( _threadCount );
+
665 }
+
666
+
667 // initialise and start all threads
+
668 int i = 0;
+
669 for ( auto& circuitThreads : _circuitThreadsParallel )
+
670 {
+
671 int j = 0;
+
672 for ( auto& circuitThread : circuitThreads )
+
673 {
+
674 circuitThread.Start( &_componentsParallel, i, j++, _threadCount );
+
675 }
+
676 ++i;
+
677 }
+
678 }
+
679
+
680 ResumeAutoTick();
+
681}
+
682
+
683// cppcheck-suppress unusedFunction
+
684inline int Circuit::GetThreadCount() const
+
685{
+
686 return _threadCount;
+
687}
+
688
+
689inline void Circuit::Tick()
+
690{
+
691 if ( _circuitDirty )
+
692 {
+
693 _Optimize();
+
694 }
+
695
+
696 // process in multiple threads if this circuit has threads
+
697 // =======================================================
+
698 if ( _threadCount != 0 )
+
699 {
+
700 auto& circuitThreads = _circuitThreadsParallel[_currentBuffer];
+
701
+
702 for ( auto& circuitThread : circuitThreads )
+
703 {
+
704 circuitThread.Sync();
+
705 }
706 for ( auto& circuitThread : circuitThreads )
707 {
-
708 circuitThread.Sync();
+
708 circuitThread.Resume();
709 }
-
710 for ( auto& circuitThread : circuitThreads )
-
711 {
-
712 circuitThread.Resume();
-
713 }
-
714 }
-
715 else
-
716 {
-
717 _circuitThreads[_currentBuffer].SyncAndResume(); // sync and resume thread x
-
718 }
-
719
-
720 if ( _bufferCount != 0 && ++_currentBuffer == _bufferCount )
-
721 {
-
722 _currentBuffer = 0;
-
723 }
-
724}
-
725
-
726inline void Circuit::Sync()
-
727{
-
728 // sync all threads
-
729 for ( auto& circuitThread : _circuitThreads )
-
730 {
-
731 circuitThread.Sync();
-
732 }
-
733 for ( auto& circuitThreads : _circuitThreadsParallel )
-
734 {
-
735 for ( auto& circuitThread : circuitThreads )
-
736 {
-
737 circuitThread.Sync();
-
738 }
-
739 }
-
740}
-
741
-
742inline void Circuit::StartAutoTick()
-
743{
-
744 _autoTickThread.Start( this );
-
745}
-
746
-
747inline void Circuit::StopAutoTick()
-
748{
-
749 _autoTickThread.Stop();
-
750 Sync();
-
751}
-
752
-
753inline void Circuit::PauseAutoTick()
-
754{
-
755 _autoTickThread.Pause();
-
756 Sync();
-
757}
-
758
-
759inline void Circuit::ResumeAutoTick()
-
760{
-
761 _autoTickThread.Resume();
-
762}
-
763
-
764inline void Circuit::Optimize()
-
765{
-
766 if ( _circuitDirty )
-
767 {
-
768 PauseAutoTick();
-
769 _Optimize();
-
770 ResumeAutoTick();
-
771 }
-
772}
-
773
-
774inline void Circuit::_Optimize()
-
775{
-
776 // scan for optimal series order -> update _components
-
777 {
-
778 std::vector<DSPatch::Component*> orderedComponents;
-
779 orderedComponents.reserve( _components.size() );
-
780
-
781 for ( auto component : _components )
-
782 {
-
783 component->Scan( orderedComponents );
-
784 }
-
785 for ( auto component : _components )
-
786 {
-
787 component->EndScan();
-
788 }
-
789
-
790 _components = std::move( orderedComponents );
-
791 }
-
792
-
793 // scan for optimal parallel order -> update _componentsParallel
-
794 if ( _threadCount != 0 )
-
795 {
-
796 std::vector<std::vector<DSPatch::Component*>> componentsMap;
-
797 componentsMap.reserve( _components.size() );
-
798
-
799 int scanPosition;
-
800 for ( int i = (int)_components.size() - 1; i >= 0; --i )
-
801 {
-
802 _components[i]->ScanParallel( componentsMap, scanPosition );
-
803 }
-
804 for ( auto component : _components )
-
805 {
-
806 component->EndScan();
-
807 }
-
808
-
809 _componentsParallel.clear();
-
810 _componentsParallel.reserve( _components.size() );
-
811 for ( auto& componentsMapEntry : componentsMap )
-
812 {
-
813 _componentsParallel.insert( _componentsParallel.end(), componentsMapEntry.begin(), componentsMapEntry.end() );
-
814 }
-
815 }
+
710 }
+
711 // process in a single thread if this circuit has no threads
+
712 // =========================================================
+
713 else if ( _bufferCount == 0 )
+
714 {
+
715 // tick all internal components
+
716 for ( auto component : _components )
+
717 {
+
718 component->Tick( 0 );
+
719 }
+
720
+
721 return;
+
722 }
+
723 else
+
724 {
+
725 _circuitThreads[_currentBuffer].SyncAndResume(); // sync and resume thread x
+
726 }
+
727
+
728 if ( _bufferCount != 0 && ++_currentBuffer == _bufferCount )
+
729 {
+
730 _currentBuffer = 0;
+
731 }
+
732}
+
733
+
734inline void Circuit::Sync()
+
735{
+
736 // sync all threads
+
737 for ( auto& circuitThread : _circuitThreads )
+
738 {
+
739 circuitThread.Sync();
+
740 }
+
741 for ( auto& circuitThreads : _circuitThreadsParallel )
+
742 {
+
743 for ( auto& circuitThread : circuitThreads )
+
744 {
+
745 circuitThread.Sync();
+
746 }
+
747 }
+
748}
+
749
+
750inline void Circuit::StartAutoTick()
+
751{
+
752 _autoTickThread.Start( this );
+
753}
+
754
+
755inline void Circuit::StopAutoTick()
+
756{
+
757 _autoTickThread.Stop();
+
758 Sync();
+
759}
+
760
+
761inline void Circuit::PauseAutoTick()
+
762{
+
763 _autoTickThread.Pause();
+
764 Sync();
+
765}
+
766
+
767inline void Circuit::ResumeAutoTick()
+
768{
+
769 _autoTickThread.Resume();
+
770}
+
771
+
772inline void Circuit::Optimize()
+
773{
+
774 if ( _circuitDirty )
+
775 {
+
776 PauseAutoTick();
+
777 _Optimize();
+
778 ResumeAutoTick();
+
779 }
+
780}
+
781
+
782inline void Circuit::_Optimize()
+
783{
+
784 // scan for optimal series order -> update _components
+
785 {
+
786 std::vector<DSPatch::Component*> orderedComponents;
+
787 orderedComponents.reserve( _components.size() );
+
788
+
789 for ( auto component : _components )
+
790 {
+
791 component->Scan( orderedComponents );
+
792 }
+
793 for ( auto component : _components )
+
794 {
+
795 component->EndScan();
+
796 }
+
797
+
798 _components = std::move( orderedComponents );
+
799 }
+
800
+
801 // scan for optimal parallel order -> update _componentsParallel
+
802 if ( _threadCount != 0 )
+
803 {
+
804 std::vector<std::vector<DSPatch::Component*>> componentsMap;
+
805 componentsMap.reserve( _components.size() );
+
806
+
807 int scanPosition;
+
808 for ( auto component : _components )
+
809 {
+
810 component->ScanParallel( componentsMap, scanPosition );
+
811 }
+
812 for ( auto component : _components )
+
813 {
+
814 component->EndScan();
+
815 }
816
-
817 // clear _circuitDirty flag
-
818 _circuitDirty = false;
-
819}
-
820
-
821} // namespace DSPatch
-
Workspace for adding and routing components.
Definition Circuit.h:73
+
817 _componentsParallel.clear();
+
818 _componentsParallel.reserve( _components.size() );
+
819 for ( auto& componentsMapEntry : componentsMap )
+
820 {
+
821 _componentsParallel.insert( _componentsParallel.end(), componentsMapEntry.begin(), componentsMapEntry.end() );
+
822 }
+
823 }
+
824
+
825 // clear _circuitDirty flag
+
826 _circuitDirty = false;
+
827}
+
828
+
829} // namespace DSPatch
+
Workspace for adding and routing components.
Definition Circuit.h:73
+ diff --git a/docs/html/_component_8h_source.html b/docs/html/_component_8h_source.html index 5f50df9e..e4b77435 100644 --- a/docs/html/_component_8h_source.html +++ b/docs/html/_component_8h_source.html @@ -3,12 +3,16 @@ - + DSPatch: Component.h Source File + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
Component.h
@@ -119,6 +134,7 @@
40{
41
43
+
65{
66public:
@@ -240,6 +256,7 @@
182
183 int _scanPosition = -1;
184};
+
185
186inline Component::Component( ProcessOrder processOrder )
187 : _processOrder( processOrder )
@@ -674,12 +691,13 @@
616}
617
618} // namespace DSPatch
-
Abstract base class for DSPatch components.
Definition Component.h:65
+
Abstract base class for DSPatch components.
Definition Component.h:65
Signal container.
Definition SignalBus.h:53
+ diff --git a/docs/html/_d_s_patch_8h_source.html b/docs/html/_d_s_patch_8h_source.html index 61e5d7cc..466d4a56 100644 --- a/docs/html/_d_s_patch_8h_source.html +++ b/docs/html/_d_s_patch_8h_source.html @@ -3,12 +3,16 @@ - + DSPatch: DSPatch.h Source File + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
DSPatch.h
@@ -113,7 +128,8 @@
+ diff --git a/docs/html/_plugin_8h_source.html b/docs/html/_plugin_8h_source.html index 4d8fa459..61d12e76 100644 --- a/docs/html/_plugin_8h_source.html +++ b/docs/html/_plugin_8h_source.html @@ -3,12 +3,16 @@ - + DSPatch: Plugin.h Source File + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
Plugin.h
@@ -122,18 +137,19 @@
43#include <string>
44
45#define EXPORT_PLUGIN( classname, ... ) \
-
46 extern "C" \
-
47 { \
-
48 DLLEXPORT DSPatch::Component* Create() \
-
49 { \
-
50 return new classname( __VA_ARGS__ ); \
-
51 } \
-
52 }
+
46 extern "C" \
+
47 { \
+
48 DLLEXPORT DSPatch::Component* Create() \
+
49 { \
+
50 return new classname( __VA_ARGS__ ); \
+
51 } \
+
52 }
53
54namespace DSPatch
55{
56
58
+
69class Plugin final
70{
71public:
@@ -153,6 +169,7 @@
85 void* _handle = nullptr;
86 Create_t _create = nullptr;
87};
+
88
89inline Plugin::Plugin( const std::string& pluginPath )
90{
@@ -216,11 +233,12 @@
148
149} // namespace DSPatch
Abstract base class for DSPatch components.
Definition Component.h:65
-
Component plugin loader.
Definition Plugin.h:70
+
Component plugin loader.
Definition Plugin.h:70
+ diff --git a/docs/html/_signal_bus_8h_source.html b/docs/html/_signal_bus_8h_source.html index b92570e6..12cb7628 100644 --- a/docs/html/_signal_bus_8h_source.html +++ b/docs/html/_signal_bus_8h_source.html @@ -3,12 +3,16 @@ - + DSPatch: SignalBus.h Source File + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
SignalBus.h
@@ -115,6 +130,7 @@
36{
37
39
+
52class SignalBus final
53{
54public:
@@ -151,6 +167,7 @@
85private:
86 std::vector<fast_any::any> _signals;
87};
+
88
89inline SignalBus::SignalBus() = default;
90
@@ -245,11 +262,12 @@
179}
180
181} // namespace DSPatch
-
Signal container.
Definition SignalBus.h:53
+
Signal container.
Definition SignalBus.h:53
+ diff --git a/docs/html/annotated.html b/docs/html/annotated.html index 6637c2f1..bbdbcd28 100644 --- a/docs/html/annotated.html +++ b/docs/html/annotated.html @@ -3,12 +3,16 @@ - + DSPatch: Class List + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,24 +34,35 @@
- + + +
+
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 12]
- +
[detail level 12]
 NDSPatch
+ @@ -85,7 +100,8 @@ + diff --git a/docs/html/class_d_s_patch_1_1_circuit-members.html b/docs/html/class_d_s_patch_1_1_circuit-members.html index 4062d8f1..2db2f2f5 100644 --- a/docs/html/class_d_s_patch_1_1_circuit-members.html +++ b/docs/html/class_d_s_patch_1_1_circuit-members.html @@ -3,12 +3,16 @@ - +DSPatch: Member List + + + + @@ -22,7 +26,7 @@ @@ -30,23 +34,33 @@
 NDSPatch
 CCircuitWorkspace for adding and routing components
 CComponentAbstract base class for DSPatch components
 CPluginComponent plugin loader
-
DSPatch v.11.2.0 +
DSPatch v.11.3.0
- + + +
+
DSPatch::Circuit Member List
@@ -105,7 +120,8 @@
+
diff --git a/docs/html/class_d_s_patch_1_1_circuit.html b/docs/html/class_d_s_patch_1_1_circuit.html index 2645e665..8d08a6e1 100644 --- a/docs/html/class_d_s_patch_1_1_circuit.html +++ b/docs/html/class_d_s_patch_1_1_circuit.html @@ -3,12 +3,16 @@ - + DSPatch: DSPatch::Circuit Class Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
DSPatch::Circuit Class Referencefinal
@@ -83,53 +97,53 @@

Workspace for adding and routing components. - More...

+ More...

#include <Circuit.h>

- - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

+
 Circuit (const Circuit &)=delete
 
+
Circuitoperator= (const Circuit &)=delete
 
bool AddComponent (const Component::SPtr &component)
bool AddComponent (const Component::SPtr &component)
 
bool RemoveComponent (const Component::SPtr &component)
bool RemoveComponent (const Component::SPtr &component)
 
void RemoveAllComponents ()
void RemoveAllComponents ()
 
int GetComponentCount () const
int GetComponentCount () const
 
bool ConnectOutToIn (const Component::SPtr &fromComponent, int fromOutput, const Component::SPtr &toComponent, int toInput)
bool ConnectOutToIn (const Component::SPtr &fromComponent, int fromOutput, const Component::SPtr &toComponent, int toInput)
 
bool DisconnectComponent (const Component::SPtr &component)
bool DisconnectComponent (const Component::SPtr &component)
 
void DisconnectAllComponents ()
void DisconnectAllComponents ()
 
void SetBufferCount (int bufferCount)
void SetBufferCount (int bufferCount)
 
int GetBufferCount () const
int GetBufferCount () const
 
void SetThreadCount (int threadCount)
void SetThreadCount (int threadCount)
 
int GetThreadCount () const
int GetThreadCount () const
 
void Tick ()
void Tick ()
 
void Sync ()
void Sync ()
 
void StartAutoTick ()
void StartAutoTick ()
 
void StopAutoTick ()
void StopAutoTick ()
 
void PauseAutoTick ()
void PauseAutoTick ()
 
void ResumeAutoTick ()
void ResumeAutoTick ()
 
void Optimize ()
void Optimize ()
 

Detailed Description

@@ -155,7 +169,7 @@

DSPatch::Circuit::~Circuit ( - ) + ) @@ -166,7 +180,7 @@

-

Definition at line 446 of file Circuit.h.

+

Definition at line 454 of file Circuit.h.

@@ -183,8 +197,7 @@

bool DSPatch::Circuit::AddComponent ( - const Component::SPtr &  - component) + const Component::SPtr & component) @@ -195,7 +208,7 @@

-

Definition at line 452 of file Circuit.h.

+

Definition at line 460 of file Circuit.h.

@@ -211,31 +224,22 @@

bool DSPatch::Circuit::ConnectOutToIn ( - const Component::SPtr &  - fromComponent, + const Component::SPtr & fromComponent, - int  - fromOutput, + int fromOutput, - const Component::SPtr &  - toComponent, + const Component::SPtr & toComponent, - int  - toInput  - - - - ) - + int toInput ) @@ -245,7 +249,7 @@

-

Definition at line 519 of file Circuit.h.

+

Definition at line 527 of file Circuit.h.

@@ -261,7 +265,7 @@

void DSPatch::Circuit::DisconnectAllComponents ( - ) + ) @@ -272,7 +276,7 @@

-

Definition at line 565 of file Circuit.h.

+

Definition at line 573 of file Circuit.h.

@@ -288,8 +292,7 @@

bool DSPatch::Circuit::DisconnectComponent ( - const Component::SPtr &  - component) + const Component::SPtr & component) @@ -300,7 +303,7 @@

-

Definition at line 541 of file Circuit.h.

+

Definition at line 549 of file Circuit.h.

@@ -316,7 +319,7 @@

int DSPatch::Circuit::GetBufferCount ( - ) + ) const @@ -327,7 +330,7 @@

-

Definition at line 620 of file Circuit.h.

+

Definition at line 628 of file Circuit.h.

@@ -343,7 +346,7 @@

int DSPatch::Circuit::GetComponentCount ( - ) + ) const @@ -354,7 +357,7 @@

-

Definition at line 514 of file Circuit.h.

+

Definition at line 522 of file Circuit.h.

@@ -370,7 +373,7 @@

int DSPatch::Circuit::GetThreadCount ( - ) + ) const @@ -381,7 +384,7 @@

-

Definition at line 676 of file Circuit.h.

+

Definition at line 684 of file Circuit.h.

@@ -397,7 +400,7 @@

void DSPatch::Circuit::Optimize ( - ) + ) @@ -408,7 +411,7 @@

-

Definition at line 764 of file Circuit.h.

+

Definition at line 772 of file Circuit.h.

@@ -424,7 +427,7 @@

void DSPatch::Circuit::PauseAutoTick ( - ) + ) @@ -435,7 +438,7 @@

-

Definition at line 753 of file Circuit.h.

+

Definition at line 761 of file Circuit.h.

@@ -451,7 +454,7 @@

void DSPatch::Circuit::RemoveAllComponents ( - ) + ) @@ -462,7 +465,7 @@

-

Definition at line 500 of file Circuit.h.

+

Definition at line 508 of file Circuit.h.

@@ -478,8 +481,7 @@

bool DSPatch::Circuit::RemoveComponent ( - const Component::SPtr &  - component) + const Component::SPtr & component) @@ -490,7 +492,7 @@

-

Definition at line 472 of file Circuit.h.

+

Definition at line 480 of file Circuit.h.

@@ -506,7 +508,7 @@

void DSPatch::Circuit::ResumeAutoTick ( - ) + ) @@ -517,7 +519,7 @@

-

Definition at line 759 of file Circuit.h.

+

Definition at line 767 of file Circuit.h.

@@ -533,8 +535,7 @@

void DSPatch::Circuit::SetBufferCount ( - int  - bufferCount) + int bufferCount) @@ -545,7 +546,7 @@

-

Definition at line 577 of file Circuit.h.

+

Definition at line 585 of file Circuit.h.

@@ -561,8 +562,7 @@

void DSPatch::Circuit::SetThreadCount ( - int  - threadCount) + int threadCount) @@ -573,7 +573,7 @@

-

Definition at line 625 of file Circuit.h.

+

Definition at line 633 of file Circuit.h.

@@ -589,7 +589,7 @@

void DSPatch::Circuit::StartAutoTick ( - ) + ) @@ -600,7 +600,7 @@

-

Definition at line 742 of file Circuit.h.

+

Definition at line 750 of file Circuit.h.

@@ -616,7 +616,7 @@

void DSPatch::Circuit::StopAutoTick ( - ) + ) @@ -627,7 +627,7 @@

-

Definition at line 747 of file Circuit.h.

+

Definition at line 755 of file Circuit.h.

@@ -643,7 +643,7 @@

void DSPatch::Circuit::Sync ( - ) + ) @@ -654,7 +654,7 @@

-

Definition at line 726 of file Circuit.h.

+

Definition at line 734 of file Circuit.h.

@@ -670,7 +670,7 @@

void DSPatch::Circuit::Tick ( - ) + ) @@ -681,7 +681,7 @@

-

Definition at line 681 of file Circuit.h.

+

Definition at line 689 of file Circuit.h.

@@ -691,7 +691,8 @@

+ diff --git a/docs/html/class_d_s_patch_1_1_component-members.html b/docs/html/class_d_s_patch_1_1_component-members.html index 2867d0bc..2f807986 100644 --- a/docs/html/class_d_s_patch_1_1_component-members.html +++ b/docs/html/class_d_s_patch_1_1_component-members.html @@ -3,12 +3,16 @@ - + DSPatch: Member List + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
DSPatch::Component Member List
@@ -107,7 +122,8 @@
+ diff --git a/docs/html/class_d_s_patch_1_1_component.html b/docs/html/class_d_s_patch_1_1_component.html index e7aaff88..9424a66c 100644 --- a/docs/html/class_d_s_patch_1_1_component.html +++ b/docs/html/class_d_s_patch_1_1_component.html @@ -3,12 +3,16 @@ - + DSPatch: DSPatch::Component Class Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + + +
-Classes | Public Types | Public Member Functions | Protected Member Functions | @@ -85,68 +99,68 @@

Abstract base class for DSPatch components. - More...

+ More...

#include <Component.h>

- - +

Public Types

enum class  ProcessOrder { InOrder +
enum class  ProcessOrder { InOrder , OutOfOrder }
 
using SPtr = std::shared_ptr< Component >
using SPtr = std::shared_ptr<Component>
 
- - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +

Public Member Functions

+
 Component (const Component &)=delete
 
+
Componentoperator= (const Component &)=delete
 
 Component (ProcessOrder processOrder=ProcessOrder::InOrder)
 Component (ProcessOrder processOrder=ProcessOrder::InOrder)
 
bool ConnectInput (const Component::SPtr &fromComponent, int fromOutput, int toInput)
bool ConnectInput (const Component::SPtr &fromComponent, int fromOutput, int toInput)
 
void DisconnectInput (int inputNo)
void DisconnectInput (int inputNo)
 
void DisconnectInput (const Component::SPtr &fromComponent)
void DisconnectInput (const Component::SPtr &fromComponent)
 
void DisconnectAllInputs ()
void DisconnectAllInputs ()
 
int GetInputCount () const
int GetInputCount () const
 
int GetOutputCount () const
int GetOutputCount () const
 
std::string GetInputName (int inputNo) const
std::string GetInputName (int inputNo) const
 
std::string GetOutputName (int outputNo) const
std::string GetOutputName (int outputNo) const
 
void SetBufferCount (int bufferCount, int startBuffer)
void SetBufferCount (int bufferCount, int startBuffer)
 
int GetBufferCount () const
int GetBufferCount () const
 
void Tick (int bufferNo)
void Tick (int bufferNo)
 
void TickParallel (int bufferNo)
void TickParallel (int bufferNo)
 
void Scan (std::vector< Component * > &components)
void Scan (std::vector< Component * > &components)
 
void ScanParallel (std::vector< std::vector< DSPatch::Component * > > &componentsMap, int &scanPosition)
void ScanParallel (std::vector< std::vector< DSPatch::Component * > > &componentsMap, int &scanPosition)
 
void EndScan ()
void EndScan ()
 
- - + - +

Protected Member Functions

+
virtual void Process_ (SignalBus &, SignalBus &)=0
 
void SetInputCount_ (int inputCount, const std::vector< std::string > &inputNames={})
void SetInputCount_ (int inputCount, const std::vector< std::string > &inputNames={})
 
void SetOutputCount_ (int outputCount, const std::vector< std::string > &outputNames={})
void SetOutputCount_ (int outputCount, const std::vector< std::string > &outputNames={})
 

Detailed Description

@@ -166,7 +180,7 @@

- +
using DSPatch::Component::SPtr = std::shared_ptr<Component>using DSPatch::Component::SPtr = std::shared_ptr<Component>

@@ -213,8 +227,7 @@

DSPatch::Component::Component ( - ProcessOrder  - processOrder = ProcessOrder::InOrder) + ProcessOrder processOrder = ProcessOrder::InOrder) @@ -242,25 +255,17 @@

bool DSPatch::Component::ConnectInput ( - const Component::SPtr &  - fromComponent, + const Component::SPtr & fromComponent, - int  - fromOutput, + int fromOutput, - int  - toInput  - - - - ) - + int toInput ) @@ -286,7 +291,7 @@

void DSPatch::Component::DisconnectAllInputs ( - ) + ) @@ -313,8 +318,7 @@

void DSPatch::Component::DisconnectInput ( - const Component::SPtr &  - fromComponent) + const Component::SPtr & fromComponent) @@ -341,8 +345,7 @@

void DSPatch::Component::DisconnectInput ( - int  - inputNo) + int inputNo) @@ -369,7 +372,7 @@

void DSPatch::Component::EndScan ( - ) + ) @@ -396,7 +399,7 @@

int DSPatch::Component::GetBufferCount ( - ) + ) const @@ -423,7 +426,7 @@

int DSPatch::Component::GetInputCount ( - ) + ) const @@ -450,8 +453,7 @@

std::string DSPatch::Component::GetInputName ( - int  - inputNo) + int inputNo) const @@ -478,7 +480,7 @@

int DSPatch::Component::GetOutputCount ( - ) + ) const @@ -505,8 +507,7 @@

std::string DSPatch::Component::GetOutputName ( - int  - outputNo) + int outputNo) const @@ -533,8 +534,7 @@

void DSPatch::Component::Scan ( - std::vector< Component * > &  - components) + std::vector< Component * > & components) @@ -561,19 +561,12 @@

void DSPatch::Component::ScanParallel ( - std::vector< std::vector< DSPatch::Component * > > &  - componentsMap, + std::vector< std::vector< DSPatch::Component * > > & componentsMap, - int &  - scanPosition  - - - - ) - + int & scanPosition ) @@ -599,19 +592,12 @@

void DSPatch::Component::SetBufferCount ( - int  - bufferCount, + int bufferCount, - int  - startBuffer  - - - - ) - + int startBuffer ) @@ -637,19 +623,12 @@

void DSPatch::Component::SetInputCount_ ( - int  - inputCount, + int inputCount, - const std::vector< std::string > &  - inputNames = {}  - - - - ) - + const std::vector< std::string > & inputNames = {} ) @@ -675,19 +654,12 @@

void DSPatch::Component::SetOutputCount_ ( - int  - outputCount, + int outputCount, - const std::vector< std::string > &  - outputNames = {}  - - - - ) - + const std::vector< std::string > & outputNames = {} ) @@ -713,8 +685,7 @@

void DSPatch::Component::Tick ( - int  - bufferNo) + int bufferNo) @@ -741,8 +712,7 @@

void DSPatch::Component::TickParallel ( - int  - bufferNo) + int bufferNo) @@ -763,7 +733,8 @@

+

diff --git a/docs/html/class_d_s_patch_1_1_plugin-members.html b/docs/html/class_d_s_patch_1_1_plugin-members.html index 00fe85e1..fd1202a9 100644 --- a/docs/html/class_d_s_patch_1_1_plugin-members.html +++ b/docs/html/class_d_s_patch_1_1_plugin-members.html @@ -3,12 +3,16 @@ - + DSPatch: Member List + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
DSPatch::Plugin Member List
@@ -89,7 +104,8 @@
+
diff --git a/docs/html/class_d_s_patch_1_1_plugin.html b/docs/html/class_d_s_patch_1_1_plugin.html index 86d3ce67..35c78538 100644 --- a/docs/html/class_d_s_patch_1_1_plugin.html +++ b/docs/html/class_d_s_patch_1_1_plugin.html @@ -3,12 +3,16 @@ - + DSPatch: DSPatch::Plugin Class Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
Public Member Functions | @@ -82,23 +97,23 @@

Component plugin loader. - More...

+ More...

#include <Plugin.h>

- - - + - + - +

Public Member Functions

+
 Plugin (const Plugin &)=delete
 
+
Pluginoperator= (const Plugin &)=delete
 
 Plugin (const std::string &pluginPath)
 Plugin (const std::string &pluginPath)
 
bool IsLoaded () const
bool IsLoaded () const
 
Component::SPtr Create () const
Component::SPtr Create () const
 

Detailed Description

@@ -120,8 +135,7 @@

DSPatch::Plugin::Plugin ( - const std::string &  - pluginPath) + const std::string & pluginPath) @@ -148,7 +162,7 @@

DSPatch::Plugin::~Plugin ( - ) + ) @@ -176,7 +190,7 @@

Component::SPtr DSPatch::Plugin::Create ( - ) + ) const @@ -203,7 +217,7 @@

bool DSPatch::Plugin::IsLoaded ( - ) + ) const @@ -224,7 +238,8 @@

+

diff --git a/docs/html/class_d_s_patch_1_1_signal_bus-members.html b/docs/html/class_d_s_patch_1_1_signal_bus-members.html index 9e578694..c4b4e2c8 100644 --- a/docs/html/class_d_s_patch_1_1_signal_bus-members.html +++ b/docs/html/class_d_s_patch_1_1_signal_bus-members.html @@ -3,12 +3,16 @@ - + DSPatch: Member List + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
DSPatch::SignalBus Member List
@@ -99,7 +114,8 @@
+
diff --git a/docs/html/class_d_s_patch_1_1_signal_bus.html b/docs/html/class_d_s_patch_1_1_signal_bus.html index dc1a8f90..28efbea4 100644 --- a/docs/html/class_d_s_patch_1_1_signal_bus.html +++ b/docs/html/class_d_s_patch_1_1_signal_bus.html @@ -3,12 +3,16 @@ - + DSPatch: DSPatch::SignalBus Class Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
Public Member Functions | @@ -82,44 +97,44 @@

Signal container. - More...

+ More...

#include <SignalBus.h>

- - - + - + - + - + - + - - + + - - + + - - + + - + - + - + - +

Public Member Functions

+
 SignalBus (const SignalBus &)=delete
 
+
SignalBusoperator= (const SignalBus &)=delete
 
 SignalBus (SignalBus &&)
 SignalBus (SignalBus &&)
 
void SetSignalCount (int signalCount)
void SetSignalCount (int signalCount)
 
int GetSignalCount () const
int GetSignalCount () const
 
fast_any::any * GetSignal (int signalIndex)
fast_any::any * GetSignal (int signalIndex)
 
bool HasValue (int signalIndex) const
bool HasValue (int signalIndex) const
 
template<typename ValueType >
ValueType * GetValue (int signalIndex) const
template<typename ValueType >
ValueType * GetValue (int signalIndex) const
 
template<typename ValueType >
void SetValue (int signalIndex, const ValueType &newValue)
template<typename ValueType >
void SetValue (int signalIndex, const ValueType &newValue)
 
template<typename ValueType >
void MoveValue (int signalIndex, ValueType &&newValue)
template<typename ValueType >
void MoveValue (int signalIndex, ValueType &&newValue)
 
void SetSignal (int toSignalIndex, const fast_any::any &fromSignal)
void SetSignal (int toSignalIndex, const fast_any::any &fromSignal)
 
void MoveSignal (int toSignalIndex, fast_any::any &fromSignal)
void MoveSignal (int toSignalIndex, fast_any::any &fromSignal)
 
void ClearAllValues ()
void ClearAllValues ()
 
fast_any::type_info GetType (int signalIndex) const
fast_any::type_info GetType (int signalIndex) const
 

Detailed Description

@@ -141,8 +156,7 @@

DSPatch::SignalBus::SignalBus ( - SignalBus &&  - rhs) + SignalBus && rhs) @@ -170,7 +184,7 @@

void DSPatch::SignalBus::ClearAllValues ( - ) + ) @@ -197,8 +211,7 @@

fast_any::any * DSPatch::SignalBus::GetSignal ( - int  - signalIndex) + int signalIndex) @@ -225,7 +238,7 @@

int DSPatch::SignalBus::GetSignalCount ( - ) + ) const @@ -252,8 +265,7 @@

fast_any::type_info DSPatch::SignalBus::GetType ( - int  - signalIndex) + int signalIndex) const @@ -282,8 +294,7 @@

ValueType * DSPatch::SignalBus::GetValue ( - int  - signalIndex) + int signalIndex) const @@ -310,8 +321,7 @@

bool DSPatch::SignalBus::HasValue ( - int  - signalIndex) + int signalIndex) const @@ -338,19 +348,12 @@

void DSPatch::SignalBus::MoveSignal ( - int  - toSignalIndex, + int toSignalIndex, - fast_any::any &  - fromSignal  - - - - ) - + fast_any::any & fromSignal ) @@ -378,19 +381,12 @@

void DSPatch::SignalBus::MoveValue ( - int  - signalIndex, + int signalIndex, - ValueType &&  - newValue  - - - - ) - + ValueType && newValue ) @@ -416,19 +412,12 @@

void DSPatch::SignalBus::SetSignal ( - int  - toSignalIndex, + int toSignalIndex, - const fast_any::any &  - fromSignal  - - - - ) - + const fast_any::any & fromSignal ) @@ -454,8 +443,7 @@

void DSPatch::SignalBus::SetSignalCount ( - int  - signalCount) + int signalCount) @@ -484,19 +472,12 @@

void DSPatch::SignalBus::SetValue ( - int  - signalIndex, + int signalIndex, - const ValueType &  - newValue  - - - - ) - + const ValueType & newValue ) @@ -516,7 +497,8 @@

+

diff --git a/docs/html/classes.html b/docs/html/classes.html index 4858a542..908240a9 100644 --- a/docs/html/classes.html +++ b/docs/html/classes.html @@ -3,12 +3,16 @@ - + DSPatch: Class Index + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,24 +34,35 @@
- + +
+
+
+
diff --git a/docs/html/clipboard.js b/docs/html/clipboard.js new file mode 100644 index 00000000..42c1fb0e --- /dev/null +++ b/docs/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/docs/html/cookie.js b/docs/html/cookie.js new file mode 100644 index 00000000..53ad21d9 --- /dev/null +++ b/docs/html/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/docs/html/dir_96ae4afe4ae1b3c2e5b248f6fc6b60cd.html b/docs/html/dir_96ae4afe4ae1b3c2e5b248f6fc6b60cd.html index 9e96bcc7..372ccf78 100644 --- a/docs/html/dir_96ae4afe4ae1b3c2e5b248f6fc6b60cd.html +++ b/docs/html/dir_96ae4afe4ae1b3c2e5b248f6fc6b60cd.html @@ -3,12 +3,16 @@ - + DSPatch: dspatch Directory Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
dspatch Directory Reference
@@ -92,7 +107,8 @@
+
diff --git a/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html index e2efed75..b377f01d 100644 --- a/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/docs/html/dir_d44c64559bbebec7f509842c48db8b23.html @@ -3,12 +3,16 @@ - + DSPatch: include Directory Reference + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,23 +34,33 @@
- + + +
+
include Directory Reference
@@ -91,7 +106,8 @@
+ diff --git a/docs/html/doxygen.css b/docs/html/doxygen.css index 1c150381..f45908ab 100644 --- a/docs/html/doxygen.css +++ b/docs/html/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.9.7*/ +/* The standard CSS for doxygen 1.11.0*/ html { /* page base colors */ @@ -145,6 +145,7 @@ html { --fragment-lineno-link-bg-color: #D8D8D8; --fragment-lineno-link-hover-fg-color: #333454; --fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; --tooltip-foreground-color: black; --tooltip-background-color: white; --tooltip-border-color: gray; @@ -152,6 +153,11 @@ html { --tooltip-declaration-color: #006318; --tooltip-link-color: #333454; --tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); /** font-family */ --font-family-normal: Roboto,sans-serif; @@ -163,6 +169,28 @@ html { --font-family-icon: Arial,Helvetica; --font-family-tooltip: Roboto,sans-serif; +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; } @media (prefers-color-scheme: dark) { @@ -298,13 +326,13 @@ html { --code-char-literal-color: #00E0F0; --code-xml-cdata-color: #C9D1D9; --code-vhdl-digit-color: #FF00FF; ---code-vhdl-char-color: #000000; ---code-vhdl-keyword-color: #700070; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; --code-vhdl-logic-color: #FF0000; --code-link-color: #79C0FF; --code-external-link-color: #79C0FF; --fragment-foreground-color: #C9D1D9; ---fragment-background-color: black; +--fragment-background-color: #010102; --fragment-border-color: #30363D; --fragment-lineno-border-color: #30363D; --fragment-lineno-background-color: black; @@ -313,6 +341,7 @@ html { --fragment-lineno-link-bg-color: #303030; --fragment-lineno-link-hover-fg-color: #8E96A1; --fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; --tooltip-foreground-color: #C9D1D9; --tooltip-background-color: #202020; --tooltip-border-color: #C9D1D9; @@ -320,6 +349,11 @@ html { --tooltip-declaration-color: #20C348; --tooltip-link-color: #79C0FF; --tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); /** font-family */ --font-family-normal: Roboto,sans-serif; @@ -331,6 +365,28 @@ html { --font-family-icon: Arial,Helvetica; --font-family-tooltip: Roboto,sans-serif; +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; }} body { background-color: var(--page-background-color); @@ -347,8 +403,6 @@ body, table, div, p, dl { /* @group Heading Levels */ .title { - font-weight: 400; - font-size: 14px; font-family: var(--font-family-normal); line-height: 28px; font-size: 150%; @@ -481,6 +535,12 @@ div.qindex{ color: var(--index-separator-color); } +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + dt.alphachar{ font-size: 180%; font-weight: bold; @@ -540,7 +600,13 @@ a { } a:hover { - text-decoration: underline; + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); } a.el { @@ -591,7 +657,24 @@ dl.el { margin-left: -1cm; } +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + ul { + text-indent: 0px; overflow: visible; } @@ -616,30 +699,63 @@ ul.multicol { .fragment { text-align: left; direction: ltr; - overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-x: auto; overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); } pre.fragment { - border: 1px solid var(--fragment-border-color); - background-color: var(--fragment-background-color); - color: var(--fragment-foreground-color); - padding: 4px 6px; - margin: 4px 8px 4px 2px; + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: var(--font-family-monospace); - font-size: 105%; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); } -div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - color: var(--fragment-foreground-color); - background-color: var(--fragment-background-color); - border: 1px solid var(--fragment-border-color); +.clipboard.success { + border-color: var(--fragment-copy-ok-color); } div.line { @@ -679,6 +795,18 @@ div.line.glow { box-shadow: 0 0 10px var(--glow-color); } +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} span.lineno { padding-right: 4px; @@ -750,10 +878,6 @@ img.light-mode-visible { display: none; } -img.formulaDsp { - -} - img.formulaInl, img.inline { vertical-align: middle; } @@ -1053,17 +1177,25 @@ dl.reflist dd { .paramtype { white-space: nowrap; + padding: 0px; + padding-bottom: 1px; } .paramname { - color: var(--memdef-param-name-color); white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; } + .paramname em { + color: var(--memdef-param-name-color); font-style: normal; + margin-right: 1px; } -.paramname code { - line-height: 14px; + +.paramname .paramdefval { + font-family: var(--font-family-monospace); } .params, .retval, .exception, .tparams { @@ -1397,7 +1529,6 @@ table.fieldtable { { height:32px; display:block; - text-decoration: none; outline: none; color: var(--nav-text-normal-color); font-family: var(--font-family-nav); @@ -1486,7 +1617,8 @@ dl { padding: 0 0 0 0; } -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +/* + dl.section { margin-left: 0px; padding-left: 0px; @@ -1499,7 +1631,7 @@ dl.note { border-color: #D0C000; } -dl.warning, dl.attention { +dl.warning, dl.attention, dl.important { margin-left: -7px; padding-left: 3px; border-left: 4px solid; @@ -1541,8 +1673,103 @@ dl.bug { border-color: #C08050; } +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + dl.section dd { - margin-bottom: 6px; + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); } @@ -1557,12 +1784,12 @@ dl.section dd { vertical-align: bottom; border-collapse: separate; } - + #projectlogo img -{ +{ border: 0px none; } - + #projectalign { vertical-align: middle; diff --git a/docs/html/doxygen_crawl.html b/docs/html/doxygen_crawl.html new file mode 100644 index 00000000..4f674205 --- /dev/null +++ b/docs/html/doxygen_crawl.html @@ -0,0 +1,52 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/html/dynsections.js b/docs/html/dynsections.js index 1f4cd14a..8985f424 100644 --- a/docs/html/dynsections.js +++ b/docs/html/dynsections.js @@ -22,106 +22,181 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function toggleVisibility(linkObj) -{ - var base = $(linkObj).attr('id'); - var summary = $('#'+base+'-summary'); - var content = $('#'+base+'-content'); - var trigger = $('#'+base+'-trigger'); - var src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; -} -function updateStripes() -{ - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); - $('table.directory tr'). - removeClass('odd').filter(':visible:odd').addClass('odd'); +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); } -function toggleLevel(level) -{ - $('table.directory tr').each(function() { - var l = this.id.split('_').length-1; - var i = $('#img'+this.id.substring(3)); - var a = $('#arr'+this.id.substring(3)); - if (l
'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; /* @license-end */ -$(document).ready(function() { +$(function() { $('.code,.codeRef').each(function() { $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); $.fn.powerTip.smartPlacementLists.s = [ 's', 'n', 'ne', 'se' ]; diff --git a/docs/html/files.html b/docs/html/files.html index a7e41a6d..1158cc32 100644 --- a/docs/html/files.html +++ b/docs/html/files.html @@ -3,12 +3,16 @@ - + DSPatch: File List + + + + @@ -22,7 +26,7 @@ Logo -
DSPatch v.11.2.0 +
DSPatch v.11.3.0
@@ -30,24 +34,35 @@
- + + +
+
Here is a list of all documented files with brief descriptions:
-
[detail level 123]
- - +
[detail level 123]
  include
  dspatch
+ + @@ -87,7 +102,8 @@ + diff --git a/docs/html/index.html b/docs/html/index.html index 4883d050..27f36e94 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -3,12 +3,16 @@ - +DSPatch: The Refreshingly Simple C++ Dataflow Framework + + + + @@ -22,7 +26,7 @@ @@ -30,24 +34,35 @@
  include
  dspatch
 Circuit.h
 Component.h
 Plugin.h
-
DSPatch v.11.2.0 +
DSPatch v.11.3.0
- + +
+
+

That's it! Enjoy using DSPatch!

(NOTE: The source code for the above tutorials can be found under the "tutorial" folder in the DSPatch root directory).

+
+ diff --git a/docs/html/menu.js b/docs/html/menu.js index b0b26936..0fd1e990 100644 --- a/docs/html/menu.js +++ b/docs/html/menu.js @@ -22,15 +22,14 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { function makeTree(data,relPath) { - var result=''; + let result=''; if ('children' in data) { result+='
    '; - for (var i in data.children) { - var url; - var link; - link = data.children[i].url; + for (let i in data.children) { + let url; + const link = data.children[i].url; if (link.substring(0,1)=='^') { url = link.substring(1); } else { @@ -44,7 +43,7 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { } return result; } - var searchBoxHtml; + let searchBoxHtml; if (searchEnabled) { if (serverSide) { searchBoxHtml='
    '+ @@ -88,29 +87,28 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { if (searchBoxHtml) { $('#main-menu').append('
  • '); } - var $mainMenuState = $('#main-menu-state'); - var prevWidth = 0; + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; if ($mainMenuState.length) { - function initResizableIfExists() { - if (typeof initResizable==='function') initResizable(); + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); } // animate mobile menu - $mainMenuState.change(function(e) { - var $menu = $('#main-menu'); - var options = { duration: 250, step: initResizableIfExists }; + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; if (this.checked) { - options['complete'] = function() { $menu.css('display', 'block') }; + options['complete'] = () => $menu.css('display', 'block'); $menu.hide().slideDown(options); } else { - options['complete'] = function() { $menu.css('display', 'none') }; + options['complete'] = () => $menu.css('display', 'none'); $menu.show().slideUp(options); } }); // set default menu visibility - function resetState() { - var $menu = $('#main-menu'); - var $mainMenuState = $('#main-menu-state'); - var newWidth = $(window).outerWidth(); + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); if (newWidth!=prevWidth) { if ($(window).outerWidth()<768) { $mainMenuState.prop('checked',false); $menu.hide(); diff --git a/docs/html/minus.svg b/docs/html/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/docs/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/minusd.svg b/docs/html/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/docs/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/html/navtree.css b/docs/html/navtree.css new file mode 100644 index 00000000..69211d4a --- /dev/null +++ b/docs/html/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: var(--nav-text-active-color); + text-shadow: var(--nav-text-active-shadow); +} + +#nav-tree .selected .arrow { + color: var(--nav-arrow-selected-color); + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--nav-text-active-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:var(--nav-splitbar-image); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/docs/html/plus.svg b/docs/html/plus.svg new file mode 100644 index 00000000..07520165 --- /dev/null +++ b/docs/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/plusd.svg b/docs/html/plusd.svg new file mode 100644 index 00000000..0c65bfe9 --- /dev/null +++ b/docs/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/html/resize.js b/docs/html/resize.js new file mode 100644 index 00000000..7d8cdc7d --- /dev/null +++ b/docs/html/resize.js @@ -0,0 +1,145 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + } + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/docs/html/search/all_0.js b/docs/html/search/all_0.js index 8b8ff2dc..21509547 100644 --- a/docs/html/search/all_0.js +++ b/docs/html/search/all_0.js @@ -1,5 +1,4 @@ var searchData= [ - ['circuit_0',['Circuit',['../class_d_s_patch_1_1_circuit.html',1,'DSPatch']]], - ['component_1',['Component',['../class_d_s_patch_1_1_component.html',1,'DSPatch']]] + ['1_20creating_20a_20component_0',['1. Creating a component',['../index.html#create_component',1,'']]] ]; diff --git a/docs/html/search/all_1.js b/docs/html/search/all_1.js index 58f67270..9c0b2da8 100644 --- a/docs/html/search/all_1.js +++ b/docs/html/search/all_1.js @@ -1,4 +1,4 @@ var searchData= [ - ['plugin_0',['Plugin',['../class_d_s_patch_1_1_plugin.html',1,'DSPatch']]] + ['2_20building_20a_20circuit_0',['2. Building a circuit',['../index.html#use_component',1,'']]] ]; diff --git a/docs/html/search/all_2.js b/docs/html/search/all_2.js index e386e6e2..3b8e8806 100644 --- a/docs/html/search/all_2.js +++ b/docs/html/search/all_2.js @@ -1,4 +1,5 @@ var searchData= [ - ['signalbus_0',['SignalBus',['../class_d_s_patch_1_1_signal_bus.html',1,'DSPatch']]] + ['a_20circuit_0',['2. Building a circuit',['../index.html#use_component',1,'']]], + ['a_20component_1',['1. Creating a component',['../index.html#create_component',1,'']]] ]; diff --git a/docs/html/search/all_3.js b/docs/html/search/all_3.js index 081616f1..4952895d 100644 --- a/docs/html/search/all_3.js +++ b/docs/html/search/all_3.js @@ -1,4 +1,4 @@ var searchData= [ - ['the_20refreshingly_20simple_20c_2b_2b_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] + ['building_20a_20circuit_0',['2. Building a circuit',['../index.html#use_component',1,'']]] ]; diff --git a/docs/html/search/all_4.js b/docs/html/search/all_4.js index 081616f1..052fe5af 100644 --- a/docs/html/search/all_4.js +++ b/docs/html/search/all_4.js @@ -1,4 +1,9 @@ var searchData= [ - ['the_20refreshingly_20simple_20c_2b_2b_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] + ['c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]], + ['circuit_1',['Circuit',['../class_d_s_patch_1_1_circuit.html',1,'DSPatch']]], + ['circuit_2',['2. Building a circuit',['../index.html#use_component',1,'']]], + ['component_3',['Component',['../class_d_s_patch_1_1_component.html',1,'DSPatch']]], + ['component_4',['1. Creating a component',['../index.html#create_component',1,'']]], + ['creating_20a_20component_5',['1. Creating a component',['../index.html#create_component',1,'']]] ]; diff --git a/docs/html/search/all_5.js b/docs/html/search/all_5.js index 78c675c9..72d41da8 100644 --- a/docs/html/search/all_5.js +++ b/docs/html/search/all_5.js @@ -1,4 +1,4 @@ var searchData= [ - ['wire_0',['Wire',['../struct_d_s_patch_1_1internal_1_1_wire.html',1,'DSPatch::internal']]] + ['dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] ]; diff --git a/docs/html/search/all_6.js b/docs/html/search/all_6.js new file mode 100644 index 00000000..91296ce9 --- /dev/null +++ b/docs/html/search/all_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['features_0',['Features',['../index.html#features_sec',1,'']]], + ['framework_1',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/all_7.js b/docs/html/search/all_7.js new file mode 100644 index 00000000..4665e806 --- /dev/null +++ b/docs/html/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['getting_20started_0',['Getting Started',['../index.html#start_sec',1,'']]] +]; diff --git a/docs/html/search/all_8.js b/docs/html/search/all_8.js new file mode 100644 index 00000000..b4ce945e --- /dev/null +++ b/docs/html/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['introduction_0',['Introduction',['../index.html#intro_sec',1,'']]] +]; diff --git a/docs/html/search/all_9.js b/docs/html/search/all_9.js new file mode 100644 index 00000000..58f67270 --- /dev/null +++ b/docs/html/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['plugin_0',['Plugin',['../class_d_s_patch_1_1_plugin.html',1,'DSPatch']]] +]; diff --git a/docs/html/search/all_a.js b/docs/html/search/all_a.js new file mode 100644 index 00000000..64bbdfab --- /dev/null +++ b/docs/html/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['refreshingly_20simple_20c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/all_b.js b/docs/html/search/all_b.js new file mode 100644 index 00000000..f782ee06 --- /dev/null +++ b/docs/html/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['signalbus_0',['SignalBus',['../class_d_s_patch_1_1_signal_bus.html',1,'DSPatch']]], + ['simple_20c_20dataflow_20framework_1',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]], + ['started_2',['Getting Started',['../index.html#start_sec',1,'']]] +]; diff --git a/docs/html/search/all_c.js b/docs/html/search/all_c.js new file mode 100644 index 00000000..0e683622 --- /dev/null +++ b/docs/html/search/all_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['the_20refreshingly_20simple_20c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]], + ['tutorials_1',['Tutorials',['../index.html#tutorial_sec',1,'']]] +]; diff --git a/docs/html/search/pages_0.js b/docs/html/search/pages_0.js index 081616f1..d5e95a9b 100644 --- a/docs/html/search/pages_0.js +++ b/docs/html/search/pages_0.js @@ -1,4 +1,4 @@ var searchData= [ - ['the_20refreshingly_20simple_20c_2b_2b_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] + ['c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] ]; diff --git a/docs/html/search/pages_1.js b/docs/html/search/pages_1.js new file mode 100644 index 00000000..72d41da8 --- /dev/null +++ b/docs/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/pages_2.js b/docs/html/search/pages_2.js new file mode 100644 index 00000000..ca2a16ca --- /dev/null +++ b/docs/html/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/pages_3.js b/docs/html/search/pages_3.js new file mode 100644 index 00000000..64bbdfab --- /dev/null +++ b/docs/html/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['refreshingly_20simple_20c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/pages_4.js b/docs/html/search/pages_4.js new file mode 100644 index 00000000..e9632f49 --- /dev/null +++ b/docs/html/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['simple_20c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/pages_5.js b/docs/html/search/pages_5.js new file mode 100644 index 00000000..a896b32f --- /dev/null +++ b/docs/html/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['the_20refreshingly_20simple_20c_20dataflow_20framework_0',['The Refreshingly Simple C++ Dataflow Framework',['../index.html',1,'']]] +]; diff --git a/docs/html/search/search.js b/docs/html/search/search.js index 9b7a52a1..666af01e 100644 --- a/docs/html/search/search.js +++ b/docs/html/search/search.js @@ -22,58 +22,9 @@ @licend The above is the entire license notice for the JavaScript code in this file */ -function convertToId(search) -{ - var result = ''; - for (i=0;i document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); // ------------ Event Handlers // Called when focus is added or removed from the search field. - this.OnSearchFieldFocus = function(isActive) - { + this.OnSearchFieldFocus = function(isActive) { this.Activate(isActive); } - this.OnSearchSelectShow = function() - { - var searchSelectWindow = this.DOMSearchSelectWindow(); - var searchField = this.DOMSearchSelect(); + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); - var left = getXPos(searchField); - var top = getYPos(searchField); - top += searchField.offsetHeight; + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; // show search selection popup searchSelectWindow.style.display='block'; @@ -146,55 +102,44 @@ function SearchBox(name, resultsPath, extension) searchSelectWindow.style.top = top + 'px'; // stop selection hide timer - if (this.hideTimeout) - { + if (this.hideTimeout) { clearTimeout(this.hideTimeout); this.hideTimeout=0; } return false; // to avoid "image drag" default event } - this.OnSearchSelectHide = function() - { + this.OnSearchSelectHide = function() { this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), this.closeSelectionTimeout); } // Called when the content of the search field is changed. - this.OnSearchFieldChange = function(evt) - { - if (this.keyTimeout) // kill running timer - { + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer clearTimeout(this.keyTimeout); this.keyTimeout = 0; } - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 || e.keyCode==13) - { - if (e.shiftKey==1) - { + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { this.OnSearchSelectShow(); - var win=this.DOMSearchSelectWindow(); - for (i=0;i do a search - { + const searchValue = this.DOMSearchField().value.replace(/ +/g, ""); + if (searchValue!="" && this.searchActive) { // something was found -> do a search this.Search(); } } - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { + } else if (e.keyCode==38 && this.searchIndex>0) { // Up this.searchIndex--; this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); this.OnSelectItem(this.searchIndex); this.CloseSelectionWindow(); this.DOMSearchField().focus(); @@ -299,82 +239,75 @@ function SearchBox(name, resultsPath, extension) // --------- Actions // Closes the results window. - this.CloseResultsWindow = function() - { + this.CloseResultsWindow = function() { this.DOMPopupSearchResultsWindow().style.display = 'none'; this.DOMSearchClose().style.display = 'none'; this.Activate(false); } - this.CloseSelectionWindow = function() - { + this.CloseSelectionWindow = function() { this.DOMSearchSelectWindow().style.display = 'none'; } // Performs a search. - this.Search = function() - { + this.Search = function() { this.keyTimeout = 0; // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair idxChar = searchValue.substr(0, 2); } - var jsFile; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; } - var loadJS = function(url, impl, loc){ - var scriptTag = document.createElement('script'); + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); scriptTag.src = url; scriptTag.onload = impl; scriptTag.onreadystatechange = impl; loc.appendChild(scriptTag); } - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - var domSearchBox = this.DOMSearchBox(); - var domPopupSearchResults = this.DOMPopupSearchResults(); - var domSearchClose = this.DOMSearchClose(); - var resultsPath = this.resultsPath; + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; - var handleResults = function() { + const handleResults = function() { document.getElementById("Loading").style.display="none"; if (typeof searchData !== 'undefined') { createResults(resultsPath); document.getElementById("NoMatches").style.display="none"; } - + if (idx!=-1) { searchResults.Search(searchValue); } else { // no file with search results => force empty search results searchResults.Search('===='); } - if (domPopupSearchResultsWindow.style.display!='block') - { + if (domPopupSearchResultsWindow.style.display!='block') { domSearchClose.style.display = 'inline-block'; - var left = getXPos(domSearchBox) + 150; - var top = getYPos(domSearchBox) + 20; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; domPopupSearchResultsWindow.style.display = 'block'; left -= domPopupSearchResults.offsetWidth; - var maxWidth = document.body.clientWidth; - var maxHeight = document.body.clientHeight; - var width = 300; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; if (left<10) left=10; if (width+left+8>maxWidth) width=maxWidth-left-8; - var height = 400; + let height = 400; if (height+top+8>maxHeight) height=maxHeight-top-8; domPopupSearchResultsWindow.style.top = top + 'px'; domPopupSearchResultsWindow.style.left = left + 'px'; @@ -396,17 +329,13 @@ function SearchBox(name, resultsPath, extension) // Activates or deactivates the search panel, resetting things to // their default values if necessary. - this.Activate = function(isActive) - { + this.Activate = function(isActive) { if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { this.DOMSearchBox().className = 'MSearchBoxActive'; this.searchActive = true; - } - else if (!isActive) // directly remove the panel - { + } else if (!isActive) { // directly remove the panel this.DOMSearchBox().className = 'MSearchBoxInactive'; this.searchActive = false; this.lastSearchValue = '' @@ -419,402 +348,347 @@ function SearchBox(name, resultsPath, extension) // ----------------------------------------------------------------------- // The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') - { - return element; - } +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; } - } - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; } - else - { - element.style.display = 'block'; + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; } } } + } - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; } + } - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; } - focusItem=null; - index++; } - return focusItem; + i++; } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; } - return focusItem; + focusItem=null; + index--; } + return focusItem; + } - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; } + return this.lastKey!=0; + } - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; } + n++; } } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - searchBox.CloseResultsWindow(); + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field document.getElementById("MSearchField").focus(); } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; } + return false; + } - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; } + return false; + } } -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} +function createResults(resultsPath) { -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } -function createResults(resultsPath) -{ - var results = document.getElementById("SRResults"); + const results = document.getElementById("SRResults"); results.innerHTML = ''; - for (var e=0; e { + const id = elem[0]; + const srResult = document.createElement('div'); srResult.setAttribute('id','SR_'+id); setClassAttr(srResult,'SRResult'); - var srEntry = document.createElement('div'); + const srEntry = document.createElement('div'); setClassAttr(srEntry,'SREntry'); - var srLink = document.createElement('a'); - srLink.setAttribute('id','Item'+e); - setKeyActions(srLink,'return searchResults.Nav(event,'+e+')'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); setClassAttr(srLink,'SRSymbol'); - srLink.innerHTML = searchData[e][1][0]; + srLink.innerHTML = elem[1][0]; srEntry.appendChild(srLink); - if (searchData[e][1].length==2) // single result - { - srLink.setAttribute('href',resultsPath+searchData[e][1][1][0]); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); - if (searchData[e][1][1][1]) - { + if (elem[1][1][1]) { srLink.setAttribute('target','_parent'); - } - else - { + } else { srLink.setAttribute('target','_blank'); } - var srScope = document.createElement('span'); + const srScope = document.createElement('span'); setClassAttr(srScope,'SRScope'); - srScope.innerHTML = searchData[e][1][1][2]; + srScope.innerHTML = elem[1][1][2]; srEntry.appendChild(srScope); - } - else // multiple results - { + } else { // multiple results srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); - var srChildren = document.createElement('div'); + const srChildren = document.createElement('div'); setClassAttr(srChildren,'SRChildren'); - for (var c=0; cli>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/include/fast_any b/include/fast_any index 2d49ccba..dcd86611 160000 --- a/include/fast_any +++ b/include/fast_any @@ -1 +1 @@ -Subproject commit 2d49ccbaf684e04c561f3fc422d5c874a812d786 +Subproject commit dcd86611f261d4ec63cd3b0589d0b9d19fe0786c