1717namespace nodepp { template < class ... A > class event_t {
1818protected:
1919
20- using DONE = function_t <bool ,A...>;
2120 struct NODE {
22- queue_t <DONE > que; uchar state=0x00 ;
23- }; ptr_t <NODE > obj;
21+ queue_t <function_t <int ,A...>> que;
22+ uchar state = 0x00 ;
23+ }; ptr_t <NODE > obj;
2424
2525 enum STATE : uchar {
2626 EV_STATE_UNKNOWN = 0b00000000 ,
@@ -44,64 +44,60 @@ namespace nodepp { template< class... A > class event_t {
4444 ptr_t <task_t > add ( function_t <int ,A...> cb ) const noexcept {
4545 ptr_t <task_t > task ( 0UL , task_t () );
4646
47- obj->que .push ([=]( A... args ){ int c=-1 ; do {
48- if ( task.null () || cb.null () ) { return false ; }
49- if ( task->flag & TASK_STATE ::CLOSED ){ return false ; }
50- if ( task->flag & TASK_STATE ::USED ){ return true ; }
51- task->flag |= TASK_STATE ::USED ; c=cb (args...) ;
52- if ( cb.null () || task.null () ) { return false ; }
53- task->flag &=~TASK_STATE ::USED ;
54- } while (c==0 ); return c==-1 ? false : true ; });
47+ if ( is_used () ){ return nullptr ; }
48+
49+ obj->que .unshift ([=]( A... args ){
50+ if ( task->flag & TASK_STATE ::CLOSED ){ return -1 ; }
51+ return cb (args...);
52+ });
5553
5654 task->flag = TASK_STATE ::OPEN ;
57- task->addr = obj->que .last ();
55+ task->addr = obj->que .last () ;
5856 task->sign = &obj;
5957
6058 return task; }
6159
6260 ptr_t <task_t > once ( function_t <void ,A...> cb ) const noexcept {
6361 ptr_t <task_t > task ( 0UL , task_t () );
6462
65- obj->que .push ([=]( A... args ){
66- if ( task.null () || cb.null () ) /* -*/ { return false ; }
67- if ( task->flag & TASK_STATE ::CLOSED ){ return false ; }
68- task->flag = TASK_STATE ::CLOSED ; cb (args...) ;
69- return false ; });
63+ if ( is_used () ){ return nullptr ; }
64+
65+ obj->que .unshift ([=]( A... args ){
66+ if ( task->flag & TASK_STATE ::CLOSED ){ return -1 ; }
67+ cb (args...); return -1 ;
68+ });
7069
7170 task->flag = TASK_STATE ::OPEN ;
72- task->addr = obj->que .last ();
71+ task->addr = obj->que .last () ;
7372 task->sign = &obj;
7473
7574 return task; }
7675
7776 ptr_t <task_t > on ( function_t <void ,A...> cb ) const noexcept {
7877 ptr_t <task_t > task ( 0UL , task_t () );
7978
80- obj->que .push ([=]( A... args ){
81- if ( task.null () ) /* --------------*/ { return false ; }
82- if ( task->flag & TASK_STATE ::CLOSED ){ return false ; }
83- if ( task->flag & TASK_STATE ::USED ){ return true ; }
84- task->flag |= TASK_STATE ::USED ; cb (args...) ;
85- if ( cb.null () || task.null () ) { return false ; }
86- task->flag &=~TASK_STATE ::USED ;
87- return true ; });
79+ if ( is_used () ){ return nullptr ; }
80+
81+ obj->que .unshift ([=]( A... args ){
82+ if ( task->flag & TASK_STATE ::CLOSED ){ return -1 ; }
83+ cb (args...); return 1 ;
84+ });
8885
8986 task->flag = TASK_STATE ::OPEN ;
90- task->addr = obj->que .last ();
87+ task->addr = obj->que .last () ;
9188 task->sign = &obj;
9289
9390 return task; }
9491
9592 /* ─······································································─*/
9693
9794 void off ( ptr_t <task_t > address ) const noexcept {
98- if ( address.null () ) /* -------------- */ { return ; }
95+ if ( address.null ()|| empty ()|| is_used () ) { return ; }
9996 if ( address->sign != &obj ) /* -------*/ { return ; }
10097 if ( address->flag & TASK_STATE ::CLOSED ){ return ; }
101- address->flag = TASK_STATE ::CLOSED ;
102- auto node = obj->que .as ( address->addr );
103- if ( node == nullptr ) /* -------------*/ { return ; }
104- obj->que .erase ( node );
98+ address->flag = TASK_STATE ::CLOSED ;
99+ auto node=obj->que .as (address->addr );
100+ if ( node ){ obj->que .erase ( node ); }
105101 }
106102
107103 /* ─······································································─*/
@@ -121,22 +117,20 @@ namespace nodepp { template< class... A > class event_t {
121117 /* ─······································································─*/
122118
123119 void emit ( const A&... args ) const noexcept {
124- if ( empty () || is_paused () || is_used () ){ return ; }
120+ if ( is_paused () || is_used () || empty () ){ return ; }
125121
126- obj->state |= STATE ::EV_STATE_USED ;
127- obj->que .set ( obj->que .first () );
122+ obj->state |= STATE ::EV_STATE_USED ;
123+ obj->que .set ( obj->que .last () );
128124
129125 while ( obj->que .get () != nullptr ){
126+ auto x=obj->que .get (); uchar z=0x01 ; auto c=x->data ;
130127
131- auto x = obj->que .get ();
132- auto y = x->next ;
133- bool val = x->data .emit ( args... );
134-
135- if ( empty () ) /* ---*/ { break ; }
136- if ( !val ){ obj->que .erase (x); }
137- if ( y==nullptr ) /* */ { break ; }
128+ if ( !c.empty () ){ z = c.emit (args...)>=0 ? 0x00 : 0x01 ; }
129+ if ( !x->prev ){ z|= 0x02 ; }
130+ if ( z & 0x01 ){ obj->que .erase (x); }
131+ if ( z & 0x02 ){ break ; }
138132
139- obj->que .next (); }
133+ obj->que .prev (); }
140134
141135 /* */ obj->state &=~ STATE ::EV_STATE_USED ;
142136 if ( obj->state & STATE ::EV_STATE_KILL ){ clear (); }
0 commit comments