]> git.pld-linux.org Git - packages/kicad.git/blame - boost-1.61.patch
- rework prep to make sure all modules are installed
[packages/kicad.git] / boost-1.61.patch
CommitLineData
c4549a7b
JR
1From 9a7bd89fd15be9af3b676cd1d7a28338e6c8cd15 Mon Sep 17 00:00:00 2001
2From: Michael Steinberg <michsteinb@gmail.com>
3Date: Tue, 5 Jul 2016 00:14:32 +0200
4Subject: [PATCH 1/3] boost::context fixes to make it compatible with boost
5 1.61
6
7(cherry picked from commit 06d4894fdbeb00727cdcc667b8899ad73d8eb1c2)
8---
9 common/tool/tool_manager.cpp | 6 +-
10 include/tool/coroutine.h | 162 ++++++++++++++++++++++++++--------------
11 include/tool/tool_base.h | 7 +-
12 include/tool/tool_interactive.h | 3 +-
13 4 files changed, 116 insertions(+), 62 deletions(-)
14
15diff --git a/common/tool/tool_manager.cpp b/common/tool/tool_manager.cpp
16index 447ab99..a198c69 100644
17--- a/common/tool/tool_manager.cpp
18+++ b/common/tool/tool_manager.cpp
19@@ -528,7 +528,7 @@ void TOOL_MANAGER::dispatchInternal( const TOOL_EVENT& aEvent )
20 }
21 }
22
23- BOOST_FOREACH( TOOL_STATE* st, m_toolState | boost::adaptors::map_values )
24+ for( TOOL_STATE* st : ( m_toolState | boost::adaptors::map_values ) )
25 {
26 // no state handler in progress - check if there are any transitions (defined by
27 // Go() method that match the event.
28@@ -542,11 +542,11 @@ void TOOL_MANAGER::dispatchInternal( const TOOL_EVENT& aEvent )
29 if( st->cofunc )
30 st->Push();
31
32+ st->cofunc = new COROUTINE<int, const TOOL_EVENT&>( tr.second );
33+
34 // as the state changes, the transition table has to be set up again
35 st->transitions.clear();
36
37- st->cofunc = new COROUTINE<int, const TOOL_EVENT&>( tr.second );
38-
39 // got match? Run the handler.
40 st->cofunc->Call( aEvent );
41
42diff --git a/include/tool/coroutine.h b/include/tool/coroutine.h
43index c7eaf5f..e21e18f 100644
44--- a/include/tool/coroutine.h
45+++ b/include/tool/coroutine.h
46@@ -3,6 +3,7 @@
47 *
48 * Copyright (C) 2013 CERN
49 * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
50+ * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
51 *
52 * This program is free software; you can redistribute it and/or
53 * modify it under the terms of the GNU General Public License
54@@ -27,10 +28,14 @@
55
56 #include <cstdlib>
57
58-#include <boost/context/fcontext.hpp>
59 #include <boost/version.hpp>
60+#include <type_traits>
61
62-#include "delegate.h"
63+#if BOOST_VERSION <= 106000
64+#include <boost/context/fcontext.hpp>
65+#else
66+#include <boost/context/execution_context.hpp>
67+#endif
68
69 /**
70 * Class COROUNTINE.
71@@ -53,13 +58,12 @@
72 * See coroutine_example.cpp for sample code.
73 */
74
75-template <class ReturnType, class ArgType>
76+template <typename ReturnType, typename ArgType>
77 class COROUTINE
78 {
79 public:
80 COROUTINE() :
81- m_saved( NULL ), m_self( NULL ), m_stack( NULL ), m_stackSize( c_defaultStackSize ),
82- m_running( false )
83+ COROUTINE( nullptr )
84 {
85 }
86
87@@ -69,8 +73,7 @@ public:
88 */
89 template <class T>
90 COROUTINE( T* object, ReturnType(T::* ptr)( ArgType ) ) :
91- m_func( object, ptr ), m_self( NULL ), m_saved( NULL ), m_stack( NULL ),
92- m_stackSize( c_defaultStackSize ), m_running( false )
93+ COROUTINE( std::bind( ptr, object, std::placeholders::_1 ) )
94 {
95 }
96
97@@ -78,9 +81,15 @@ public:
98 * Constructor
99 * Creates a coroutine from a delegate object
100 */
101- COROUTINE( DELEGATE<ReturnType, ArgType> aEntry ) :
102- m_func( aEntry ), m_saved( NULL ), m_self( NULL ), m_stack( NULL ),
103- m_stackSize( c_defaultStackSize ), m_running( false )
104+ COROUTINE( std::function<ReturnType(ArgType)> aEntry ) :
105+ m_func( std::move( aEntry ) ),
106+ m_running( false ),
107+#if BOOST_VERSION <= 106000
108+ m_stack( nullptr ),
109+ m_stackSize( c_defaultStackSize ),
110+#endif
111+ m_caller( nullptr ),
112+ m_callee( nullptr )
113 {
114 // Avoid not initialized members, and make static analysers quiet
115 m_args = 0;
116@@ -89,18 +98,26 @@ public:
117
118 ~COROUTINE()
119 {
120- if( m_saved )
121- delete m_saved;
122-
123 #if BOOST_VERSION >= 105600
124- if( m_self )
125- delete m_self;
126+ delete m_callee;
127 #endif
128
129+#if BOOST_VERSION <= 106000
130+ delete m_caller;
131+
132 if( m_stack )
133 free( m_stack );
134+#endif
135 }
136
137+private:
138+#if BOOST_VERSION <= 106000
139+ using context_type = boost::context::fcontext_t;
140+#else
141+ using context_type = boost::context::execution_context<COROUTINE*>;
142+#endif
143+
144+public:
145 /**
146 * Function Yield()
147 *
148@@ -110,7 +127,12 @@ public:
149 */
150 void Yield()
151 {
152- jump( m_self, m_saved, 0 );
153+#if BOOST_VERSION <= 106000
154+ jump( m_callee, m_caller, false );
155+#else
156+ auto result = (*m_caller)( this );
157+ *m_caller = std::move( std::get<0>( result ) );
158+#endif
159 }
160
161 /**
162@@ -122,7 +144,11 @@ public:
163 void Yield( ReturnType& aRetVal )
164 {
165 m_retVal = aRetVal;
166- jump( m_self, m_saved, 0 );
167+#if BOOST_VERSION <= 106000
168+ jump( m_callee, m_caller, false );
169+#else
170+ m_caller( this );
171+#endif
172 }
173
174 /**
175@@ -130,9 +156,9 @@ public:
176 *
177 * Defines the entry point for the coroutine, if not set in the constructor.
178 */
179- void SetEntry( DELEGATE<ReturnType, ArgType> aEntry )
180+ void SetEntry( std::function<ReturnType(ArgType)> aEntry )
181 {
182- m_func = aEntry;
183+ m_func = std::move( aEntry );
184 }
185
186 /* Function Call()
187@@ -143,6 +169,10 @@ public:
188 */
189 bool Call( ArgType aArgs )
190 {
191+ assert( m_callee == NULL );
192+ assert( m_caller == NULL );
193+
194+#if BOOST_VERSION <= 106000
195 // fixme: Clean up stack stuff. Add a guard
196 m_stack = malloc( c_defaultStackSize );
197
198@@ -151,22 +181,32 @@ public:
199
200 // correct the stack size
201 m_stackSize -= ( (size_t) m_stack + m_stackSize - (size_t) sp );
202-
203- assert( m_self == NULL );
204- assert( m_saved == NULL );
205+#endif
206
207 m_args = &aArgs;
208-#if BOOST_VERSION >= 105600
209- m_self = new boost::context::fcontext_t();
210- *m_self = boost::context::make_fcontext( sp, m_stackSize, callerStub );
211+
212+#if BOOST_VERSION < 105600
213+ m_callee = boost::context::make_fcontext( sp, m_stackSize, callerStub );
214+#elif BOOST_VERSION <= 106000
215+ m_callee = new context_type( boost::context::make_fcontext( sp, m_stackSize, callerStub ) );
216 #else
217- m_self = boost::context::make_fcontext( sp, m_stackSize, callerStub );
218+ m_callee = new context_type( std::allocator_arg_t(),
219+ boost::context::fixedsize_stack( c_defaultStackSize ), &COROUTINE::callerStub );
220+#endif
221+
222+#if BOOST_VERSION <= 106000
223+ m_caller = new context_type();
224 #endif
225- m_saved = new boost::context::fcontext_t();
226
227 m_running = true;
228+
229 // off we go!
230- jump( m_saved, m_self, reinterpret_cast<intptr_t>( this ) );
231+#if BOOST_VERSION <= 106000
232+ jump( m_caller, m_callee, reinterpret_cast<intptr_t>( this ) );
233+#else
234+ auto result = (*m_callee)( this );
235+ *m_callee = std::move( std::get<0>( result ) );
236+#endif
237 return m_running;
238 }
239
240@@ -179,7 +219,12 @@ public:
241 */
242 bool Resume()
243 {
244- jump( m_saved, m_self, 0 );
245+#if BOOST_VERSION <= 106000
246+ jump( m_caller, m_callee, false );
247+#else
248+ auto result = (*m_callee)( this );
249+ *m_callee = std::move( std::get<0>( result ) );
250+#endif
251
252 return m_running;
253 }
254@@ -208,61 +253,66 @@ private:
255 static const int c_defaultStackSize = 2000000; // fixme: make configurable
256
257 /* real entry point of the coroutine */
258+#if BOOST_VERSION <= 106000
259 static void callerStub( intptr_t aData )
260+#else
261+ static context_type callerStub( context_type caller, COROUTINE* cor )
262+#endif
263 {
264 // get pointer to self
265+#if BOOST_VERSION <= 106000
266 COROUTINE<ReturnType, ArgType>* cor = reinterpret_cast<COROUTINE<ReturnType, ArgType>*>( aData );
267+#else
268+ cor->m_caller = &caller;
269+#endif
270
271 // call the coroutine method
272- cor->m_retVal = cor->m_func( *cor->m_args );
273+ cor->m_retVal = cor->m_func( *( cor->m_args ) );
274 cor->m_running = false;
275
276 // go back to wherever we came from.
277- jump( cor->m_self, cor->m_saved, 0 ); // reinterpret_cast<intptr_t>( this ));
278+#if BOOST_VERSION <= 106000
279+ jump( cor->m_callee, cor->m_caller, 0 );
280+#else
281+ return caller;
282+#endif
283 }
284
285 ///> Wrapper for jump_fcontext to assure compatibility between different boost versions
286- static inline intptr_t jump(boost::context::fcontext_t* aOld, boost::context::fcontext_t* aNew,
287+#if BOOST_VERSION <= 106000
288+ static inline intptr_t jump( context_type* aOld, context_type* aNew,
289 intptr_t aP, bool aPreserveFPU = true )
290 {
291-#if BOOST_VERSION >= 105600
292- return boost::context::jump_fcontext( aOld, *aNew, aP, aPreserveFPU );
293-#else
294+#if BOOST_VERSION < 105600
295 return boost::context::jump_fcontext( aOld, aNew, aP, aPreserveFPU );
296+#else
297+ return boost::context::jump_fcontext( aOld, *aNew, aP, aPreserveFPU );
298 #endif
299 }
300+#endif
301
302- template <typename T>
303- struct strip_ref
304- {
305- typedef T result;
306- };
307+ std::function<ReturnType(ArgType)> m_func;
308
309- template <typename T>
310- struct strip_ref<T&>
311- {
312- typedef T result;
313- };
314+ bool m_running;
315
316- DELEGATE<ReturnType, ArgType> m_func;
317+#if BOOST_VERSION <= 106000
318+ ///< coroutine stack
319+ void* m_stack;
320+
321+ size_t m_stackSize;
322+#endif
323
324 ///< pointer to coroutine entry arguments. Stripped of references
325 ///< to avoid compiler errors.
326- typename strip_ref<ArgType>::result* m_args;
327+ typename std::remove_reference<ArgType>::type* m_args;
328+
329 ReturnType m_retVal;
330
331 ///< saved caller context
332- boost::context::fcontext_t* m_saved;
333+ context_type* m_caller;
334
335 ///< saved coroutine context
336- boost::context::fcontext_t* m_self;
337-
338- ///< coroutine stack
339- void* m_stack;
340-
341- size_t m_stackSize;
342-
343- bool m_running;
344+ context_type* m_callee;
345 };
346
347 #endif
348diff --git a/include/tool/tool_base.h b/include/tool/tool_base.h
349index 584a979..3bef987 100644
350--- a/include/tool/tool_base.h
351+++ b/include/tool/tool_base.h
352@@ -3,6 +3,7 @@
353 *
354 * Copyright (C) 2013 CERN
355 * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
356+ * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
357 *
358 * This program is free software; you can redistribute it and/or
359 * modify it under the terms of the GNU General Public License
360@@ -31,7 +32,7 @@
361 #include <tool/tool_event.h>
362 #include <tool/tool_settings.h>
363
364-#include <tool/delegate.h>
365+#include <functional>
366
367 class EDA_ITEM;
368 class TOOL_MANAGER;
369@@ -53,7 +54,9 @@ enum TOOL_TYPE
370
371 /// Unique identifier for tools
372 typedef int TOOL_ID;
373-typedef DELEGATE<int, const TOOL_EVENT&> TOOL_STATE_FUNC;
374+
375+using TOOL_STATE_FUNC = std::function<int(const TOOL_EVENT&)>;
376+
377
378 /**
379 * Class TOOL_BASE
380diff --git a/include/tool/tool_interactive.h b/include/tool/tool_interactive.h
381index 17d2de7..240eb58 100644
382--- a/include/tool/tool_interactive.h
383+++ b/include/tool/tool_interactive.h
384@@ -3,6 +3,7 @@
385 *
386 * Copyright (C) 2013 CERN
387 * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
388+ * Copyright (C) 2016 KiCad Developers, see AUTHORS.txt for contributors.
389 *
390 * This program is free software; you can redistribute it and/or
391 * modify it under the terms of the GNU General Public License
392@@ -113,7 +114,7 @@ template <class T>
393 void TOOL_INTERACTIVE::Go( int (T::* aStateFunc)( const TOOL_EVENT& ),
394 const TOOL_EVENT_LIST& aConditions )
395 {
396- TOOL_STATE_FUNC sptr( static_cast<T*>( this ), aStateFunc );
397+ TOOL_STATE_FUNC sptr = std::bind( aStateFunc, static_cast<T*>( this ), std::placeholders::_1 );
398
399 goInternal( sptr, aConditions );
400 }
401--
4022.9.3
403
404From 157c499b031659b895c1a7fef056d02a94bce0b3 Mon Sep 17 00:00:00 2001
405From: decimad <michsteinb@gmail.com>
406Date: Tue, 5 Jul 2016 18:02:50 +0200
407Subject: [PATCH 2/3] use a guarded stack for coroutines in boost version 1.61
408
409(cherry picked from commit 78bc3c65de6c03d19be9902327d08cd4d87c229c)
410---
411 include/tool/coroutine.h | 3 ++-
412 1 file changed, 2 insertions(+), 1 deletion(-)
413
414diff --git a/include/tool/coroutine.h b/include/tool/coroutine.h
415index e21e18f..8e472ca 100644
416--- a/include/tool/coroutine.h
417+++ b/include/tool/coroutine.h
418@@ -35,6 +35,7 @@
419 #include <boost/context/fcontext.hpp>
420 #else
421 #include <boost/context/execution_context.hpp>
422+#include <boost/context/protected_fixedsize_stack.hpp>
423 #endif
424
425 /**
426@@ -191,7 +192,7 @@ public:
427 m_callee = new context_type( boost::context::make_fcontext( sp, m_stackSize, callerStub ) );
428 #else
429 m_callee = new context_type( std::allocator_arg_t(),
430- boost::context::fixedsize_stack( c_defaultStackSize ), &COROUTINE::callerStub );
431+ boost::context::protected_fixedsize_stack( c_defaultStackSize ), &COROUTINE::callerStub );
432 #endif
433
434 #if BOOST_VERSION <= 106000
435--
4362.9.3
437
438From 418c62f03d9bd81881a17c9cca9c30f839d23e3a Mon Sep 17 00:00:00 2001
439From: decimad <michsteinb@gmail.com>
440Date: Tue, 2 Aug 2016 11:39:39 +0200
441Subject: [PATCH 3/3] Refactor coroutine to improve readability and removed
442 unnecessary heap allocations. Added documentation/links to various boost doc
443 revisions.
444
445(cherry picked from commit 18b7dbf4d166fcb7da10ced72268a77f02448188)
446---
447 include/tool/coroutine.h | 221 +++++++++++++++++++++++++----------------------
448 include/tool/delegate.h | 100 ---------------------
449 2 files changed, 120 insertions(+), 201 deletions(-)
450 delete mode 100644 include/tool/delegate.h
451
452diff --git a/include/tool/coroutine.h b/include/tool/coroutine.h
453index 8e472ca..70ef6cb 100644
454--- a/include/tool/coroutine.h
455+++ b/include/tool/coroutine.h
456@@ -31,7 +31,7 @@
457 #include <boost/version.hpp>
458 #include <type_traits>
459
460-#if BOOST_VERSION <= 106000
461+#if BOOST_VERSION < 106100
462 #include <boost/context/fcontext.hpp>
463 #else
464 #include <boost/context/execution_context.hpp>
465@@ -39,6 +39,44 @@
466 #endif
467
468 /**
469+ * Note: in the history of boost, two changes to the context interface happened.
470+ * [1.54, 1.56)
471+ * http://www.boost.org/doc/libs/1_55_0/libs/context/doc/html/context/context/boost_fcontext.html
472+ * intptr_t jump_fcontext(
473+ * fcontext_t* ofc,
474+ * fcontext_t const* nfc,
475+ * intptr_t vp,
476+ * bool preserve_fpu = true
477+ * );
478+ *
479+ * fcontext_t* make_fcontext(
480+ * void* sp,
481+ * std::size_t size,
482+ * void (*fn)(intptr_t)
483+ * );
484+ *
485+ * [1.56, 1.61)
486+ * http://www.boost.org/doc/libs/1_56_0/libs/context/doc/html/context/context/boost_fcontext.html
487+ * intptr_t jump_fcontext(
488+ * fcontext_t* ofc,
489+ * fcontext_t nfc, <-----
490+ * intptr_t vp,
491+ * bool preserve_fpu = true
492+ * );
493+ *
494+ * fcontext_t make_fcontext( <-----
495+ * void* sp,
496+ * std::size_t size,
497+ * void(*fn)(intptr_t)
498+ * );
499+ *
500+ * [1.61, oo)
501+ * http://www.boost.org/doc/libs/1_61_0/libs/context/doc/html/context/ecv2.html
502+ * fcontext_t is hidden away behind the boost::execution_context(_v2) and the stack is created on behalf of
503+ * the user.
504+ */
505+
506+/**
507 * Class COROUNTINE.
508 * Implements a coroutine. Wikipedia has a good explanation:
509 *
510@@ -73,7 +111,7 @@ public:
511 * Creates a coroutine from a member method of an object
512 */
513 template <class T>
514- COROUTINE( T* object, ReturnType(T::* ptr)( ArgType ) ) :
515+ COROUTINE( T* object, ReturnType(T::*ptr)( ArgType ) ) :
516 COROUTINE( std::bind( ptr, object, std::placeholders::_1 ) )
517 {
518 }
519@@ -85,34 +123,20 @@ public:
520 COROUTINE( std::function<ReturnType(ArgType)> aEntry ) :
521 m_func( std::move( aEntry ) ),
522 m_running( false ),
523-#if BOOST_VERSION <= 106000
524- m_stack( nullptr ),
525- m_stackSize( c_defaultStackSize ),
526+ m_args( 0 ),
527+#if BOOST_VERSION < 106100 // -> m_callee = void* or void**
528+ m_callee( nullptr ),
529 #endif
530- m_caller( nullptr ),
531- m_callee( nullptr )
532+ m_retVal( 0 )
533 {
534- // Avoid not initialized members, and make static analysers quiet
535- m_args = 0;
536- m_retVal = 0;
537 }
538
539 ~COROUTINE()
540 {
541-#if BOOST_VERSION >= 105600
542- delete m_callee;
543-#endif
544-
545-#if BOOST_VERSION <= 106000
546- delete m_caller;
547-
548- if( m_stack )
549- free( m_stack );
550-#endif
551 }
552
553 private:
554-#if BOOST_VERSION <= 106000
555+#if BOOST_VERSION < 106100
556 using context_type = boost::context::fcontext_t;
557 #else
558 using context_type = boost::context::execution_context<COROUTINE*>;
559@@ -128,12 +152,7 @@ public:
560 */
561 void Yield()
562 {
563-#if BOOST_VERSION <= 106000
564- jump( m_callee, m_caller, false );
565-#else
566- auto result = (*m_caller)( this );
567- *m_caller = std::move( std::get<0>( result ) );
568-#endif
569+ jumpOut();
570 }
571
572 /**
573@@ -145,11 +164,20 @@ public:
574 void Yield( ReturnType& aRetVal )
575 {
576 m_retVal = aRetVal;
577-#if BOOST_VERSION <= 106000
578- jump( m_callee, m_caller, false );
579-#else
580- m_caller( this );
581-#endif
582+ jumpOut();
583+ }
584+
585+ /**
586+ * Function Resume()
587+ *
588+ * Resumes execution of a previously yielded coroutine.
589+ * @return true, if the coroutine has yielded again and false if it has finished its
590+ * execution (returned).
591+ */
592+ bool Resume()
593+ {
594+ jumpIn();
595+ return m_running;
596 }
597
598 /**
599@@ -170,62 +198,37 @@ public:
600 */
601 bool Call( ArgType aArgs )
602 {
603- assert( m_callee == NULL );
604- assert( m_caller == NULL );
605+ assert( m_func );
606+ assert( !m_callee );
607+
608+ m_args = &aArgs;
609+
610+#if BOOST_VERSION < 106100
611+ assert( m_stack == nullptr );
612
613-#if BOOST_VERSION <= 106000
614 // fixme: Clean up stack stuff. Add a guard
615- m_stack = malloc( c_defaultStackSize );
616+ size_t stackSize = c_defaultStackSize;
617+ m_stack.reset( new char[stackSize] );
618
619 // align to 16 bytes
620- void* sp = (void*) ( ( ( (ptrdiff_t) m_stack ) + m_stackSize - 0xf ) & ( ~0x0f ) );
621+ void* sp = (void*) ( ( ( (ptrdiff_t) m_stack.get() ) + stackSize - 0xf ) & ( ~0x0f ) );
622
623 // correct the stack size
624- m_stackSize -= ( (size_t) m_stack + m_stackSize - (size_t) sp );
625-#endif
626-
627- m_args = &aArgs;
628+ stackSize -= size_t( ( (ptrdiff_t) m_stack.get() + stackSize) - (ptrdiff_t) sp );
629
630-#if BOOST_VERSION < 105600
631- m_callee = boost::context::make_fcontext( sp, m_stackSize, callerStub );
632-#elif BOOST_VERSION <= 106000
633- m_callee = new context_type( boost::context::make_fcontext( sp, m_stackSize, callerStub ) );
634+ m_callee = boost::context::make_fcontext( sp, stackSize, callerStub );
635 #else
636- m_callee = new context_type( std::allocator_arg_t(),
637- boost::context::protected_fixedsize_stack( c_defaultStackSize ), &COROUTINE::callerStub );
638-#endif
639-
640-#if BOOST_VERSION <= 106000
641- m_caller = new context_type();
642+ m_callee = context_type(
643+ std::allocator_arg_t(),
644+ boost::context::protected_fixedsize_stack( c_defaultStackSize ),
645+ &COROUTINE::callerStub
646+ );
647 #endif
648
649 m_running = true;
650
651 // off we go!
652-#if BOOST_VERSION <= 106000
653- jump( m_caller, m_callee, reinterpret_cast<intptr_t>( this ) );
654-#else
655- auto result = (*m_callee)( this );
656- *m_callee = std::move( std::get<0>( result ) );
657-#endif
658- return m_running;
659- }
660-
661- /**
662- * Function Resume()
663- *
664- * Resumes execution of a previously yielded coroutine.
665- * @return true, if the coroutine has yielded again and false if it has finished its
666- * execution (returned).
667- */
668- bool Resume()
669- {
670-#if BOOST_VERSION <= 106000
671- jump( m_caller, m_callee, false );
672-#else
673- auto result = (*m_callee)( this );
674- *m_callee = std::move( std::get<0>( result ) );
675-#endif
676+ jumpIn();
677
678 return m_running;
679 }
680@@ -254,66 +257,82 @@ private:
681 static const int c_defaultStackSize = 2000000; // fixme: make configurable
682
683 /* real entry point of the coroutine */
684-#if BOOST_VERSION <= 106000
685+#if BOOST_VERSION < 106100
686 static void callerStub( intptr_t aData )
687-#else
688- static context_type callerStub( context_type caller, COROUTINE* cor )
689-#endif
690 {
691 // get pointer to self
692-#if BOOST_VERSION <= 106000
693- COROUTINE<ReturnType, ArgType>* cor = reinterpret_cast<COROUTINE<ReturnType, ArgType>*>( aData );
694+ COROUTINE* cor = reinterpret_cast<COROUTINE*>( aData );
695+
696+ // call the coroutine method
697+ cor->m_retVal = cor->m_func( *(cor->m_args) );
698+ cor->m_running = false;
699+
700+ // go back to wherever we came from.
701+ cor->jumpOut();
702+ }
703 #else
704- cor->m_caller = &caller;
705-#endif
706+ /* real entry point of the coroutine */
707+ static context_type callerStub( context_type caller, COROUTINE* cor )
708+ {
709+ cor->m_caller = std::move( caller );
710
711 // call the coroutine method
712- cor->m_retVal = cor->m_func( *( cor->m_args ) );
713+ cor->m_retVal = cor->m_func( *(cor->m_args) );
714 cor->m_running = false;
715
716 // go back to wherever we came from.
717-#if BOOST_VERSION <= 106000
718- jump( cor->m_callee, cor->m_caller, 0 );
719+ return std::move( cor->m_caller );
720+ }
721+#endif
722+
723+ void jumpIn()
724+ {
725+#if BOOST_VERSION < 105600
726+ boost::context::jump_fcontext( &m_caller, m_callee, reinterpret_cast<intptr_t>(this) );
727+#elif BOOST_VERSION < 106100
728+ boost::context::jump_fcontext( &m_caller, m_callee, reinterpret_cast<intptr_t>(this) );
729 #else
730- return caller;
731+ auto result = m_callee( this );
732+ m_callee = std::move( std::get<0>( result ) );
733 #endif
734 }
735
736- ///> Wrapper for jump_fcontext to assure compatibility between different boost versions
737-#if BOOST_VERSION <= 106000
738- static inline intptr_t jump( context_type* aOld, context_type* aNew,
739- intptr_t aP, bool aPreserveFPU = true )
740+ void jumpOut()
741 {
742 #if BOOST_VERSION < 105600
743- return boost::context::jump_fcontext( aOld, aNew, aP, aPreserveFPU );
744+ boost::context::jump_fcontext( m_callee, &m_caller, 0 );
745+#elif BOOST_VERSION < 106100
746+ boost::context::jump_fcontext( &m_callee, m_caller, 0 );
747 #else
748- return boost::context::jump_fcontext( aOld, *aNew, aP, aPreserveFPU );
749+ auto result = m_caller( nullptr );
750+ m_caller = std::move( std::get<0>( result ) );
751 #endif
752 }
753-#endif
754
755 std::function<ReturnType(ArgType)> m_func;
756
757 bool m_running;
758
759-#if BOOST_VERSION <= 106000
760+#if BOOST_VERSION < 106100
761 ///< coroutine stack
762- void* m_stack;
763-
764- size_t m_stackSize;
765+ std::unique_ptr<char[]> m_stack;
766 #endif
767
768 ///< pointer to coroutine entry arguments. Stripped of references
769 ///< to avoid compiler errors.
770 typename std::remove_reference<ArgType>::type* m_args;
771
772- ReturnType m_retVal;
773-
774 ///< saved caller context
775- context_type* m_caller;
776+ context_type m_caller;
777
778 ///< saved coroutine context
779+#if BOOST_VERSION < 105600
780 context_type* m_callee;
781+#else
782+ context_type m_callee;
783+#endif
784+
785+ ReturnType m_retVal;
786 };
787
788 #endif
789diff --git a/include/tool/delegate.h b/include/tool/delegate.h
790deleted file mode 100644
791index a350dec..0000000
792--- a/include/tool/delegate.h
793+++ /dev/null
794@@ -1,100 +0,0 @@
795-/*
796- * This program source code file is part of KiCad, a free EDA CAD application.
797- *
798- * Copyright (C) 2013 CERN
799- * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
800- *
801- * This program is free software; you can redistribute it and/or
802- * modify it under the terms of the GNU General Public License
803- * as published by the Free Software Foundation; either version 2
804- * of the License, or (at your option) any later version.
805- *
806- * This program is distributed in the hope that it will be useful,
807- * but WITHOUT ANY WARRANTY; without even the implied warranty of
808- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
809- * GNU General Public License for more details.
810- *
811- * You should have received a copy of the GNU General Public License
812- * along with this program; if not, you may find one here:
813- * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
814- * or you may search the http://www.gnu.org website for the version 2 license,
815- * or you may write to the Free Software Foundation, Inc.,
816- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
817- */
818-
819-#ifndef __DELEGATE_H
820-#define __DELEGATE_H
821-
822-
823-/**
824- * class DELEGATE
825- * A trivial delegate (pointer to member method of an object) pattern implementation.
826- * Check delegate_example.cpp for a coding sample.
827- */
828-
829-template <class ReturnType, class Arg>
830-class DELEGATE
831-{
832-public:
833- typedef ReturnType (DELEGATE<ReturnType, Arg>::* MemberPointer)( Arg );
834- typedef ReturnType _ReturnType;
835- typedef Arg _ArgType;
836-
837- DELEGATE()
838- {
839- }
840-
841- template <class T>
842- DELEGATE( T* aObject, ReturnType(T::* aPtr)( Arg ) )
843- {
844- m_ptr = reinterpret_cast<MemberPointer>( aPtr );
845- m_object = reinterpret_cast<void*>( aObject );
846- };
847-
848-
849- ReturnType operator()( Arg aA ) const
850- {
851- DELEGATE<ReturnType, Arg>* casted = reinterpret_cast<DELEGATE<ReturnType, Arg>*>( m_object );
852- return (casted->*m_ptr)( aA );
853- }
854-
855-private:
856- MemberPointer m_ptr;
857- void* m_object;
858-};
859-
860-/**
861- * Class DELEGATE0
862- * Same as DELEGATE, but with no arguments.
863- */
864-template <class ReturnType>
865-class DELEGATE0
866-{
867-public:
868- typedef ReturnType ( DELEGATE0<ReturnType>::* MemberPointer )();
869- typedef ReturnType _ReturnType;
870-
871- DELEGATE0()
872- {
873- }
874-
875- template <class T>
876- DELEGATE0( T* aObject, ReturnType(T::* aPtr)() )
877- {
878- m_ptr = reinterpret_cast<MemberPointer>( aPtr );
879- m_object = reinterpret_cast<void*>( aObject );
880- };
881-
882-
883- ReturnType operator()() const
884- {
885- DELEGATE0<ReturnType>* casted = reinterpret_cast<DELEGATE0<ReturnType>*>( m_object );
886- return ( casted->*m_ptr )();
887- }
888-
889-private:
890- MemberPointer m_ptr;
891- void* m_object;
892-};
893-
894-#endif
895--
8962.9.3
897
This page took 0.202626 seconds and 4 git commands to generate.