1 #ifndef __DALI_INTERNAL_MESSAGE_H__
2 #define __DALI_INTERNAL_MESSAGE_H__
5 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/internal/common/buffer-index.h>
23 #include <dali/internal/common/type-abstraction.h>
24 #include <dali/internal/update/common/scene-graph-buffers.h>
33 * An abstract base class for messages queued across threads.
34 * Messages are only allowed to contain value objects, either copies of the parameters or pointers
35 * If message parameter type is & or const& the message will try to take a copy of the actual type
42 * Construct the message base.
51 virtual ~MessageBase()
56 * Called to process the message.
57 * @param [in] bufferIndex The current update/render buffer index (depending on which thread processes the message).
59 virtual void Process( BufferIndex bufferIndex ) = 0;
65 * Templated message which calls a member function of an object.
66 * This allows nodes etc. to be modified in a thread-safe manner, when the update occurs in a separate thread.
67 * The object lifetime must controlled i.e. not destroyed before the message is processed.
69 template< typename T >
70 class Message : public MessageBase
74 typedef void(T::*MemberFunction)();
78 * @note The object is expected to be const in the thread which sends this message.
79 * However it can be modified when Process() is called in a different thread.
80 * @param[in] obj The object to be updated in a separate thread.
81 * @param[in] member The member function of the object.
83 Message( const T* obj, MemberFunction member )
85 object( const_cast< T* >( obj ) ),
86 memberFunction( member )
98 * @copydoc MessageBase::Process
100 virtual void Process( BufferIndex /*bufferIndex*/ )
102 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
103 (object->*memberFunction)();
109 MemberFunction memberFunction;
114 * Templated message which calls a member function of an object.
115 * This overload passes one value-type parameter.
116 * Template parameters need to match the MemberFunction!
117 * The message will contain copy of the value (in case of & or const&)
119 template< typename T, typename P >
120 class MessageValue1 : public MessageBase
124 typedef void(T::*MemberFunction)( typename ParameterType< P >::PassingType );
128 * @note The object is expected to be const in the thread which sends this message.
129 * However it can be modified when Process() is called in a different thread.
130 * @param[in] obj The object.
131 * @param[in] member The member function of the object.
132 * @param[in] p1 The first value-type parameter to pass to the member function.
134 MessageValue1( const T* obj,
135 MemberFunction member,
136 typename ParameterType< P >::PassingType p1 )
138 object( const_cast< T* >( obj ) ),
139 memberFunction( member ),
147 virtual ~MessageValue1()
152 * @copydoc MessageBase::Process
154 virtual void Process( BufferIndex /*bufferIndex*/ )
156 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
157 (object->*memberFunction)( ParameterType< P >::PassObject( param1 ) );
163 MemberFunction memberFunction;
164 typename ParameterType< P >::HolderType param1;
169 * Templated message which calls a member function of an object.
170 * This overload passes two value-type parameters.
171 * Template parameters need to match the MemberFunction!
172 * The message will contain copy of the value (in case of & or const&)
175 template< typename T, typename P1, typename P2 >
176 class MessageValue2 : public MessageBase
180 typedef void(T::*MemberFunction)(
181 typename ParameterType< P1 >::PassingType,
182 typename ParameterType< P2 >::PassingType );
186 * @note The object is expected to be const in the thread which sends this message.
187 * However it can be modified when Process() is called in a different thread.
188 * @param[in] obj The object.
189 * @param[in] member The member function of the object.
190 * @param[in] p1 The first parameter to pass to the member function.
191 * @param[in] p2 The second parameter to pass to the member function.
193 MessageValue2( const T* obj,
194 MemberFunction member,
195 typename ParameterType< P1 >::PassingType p1,
196 typename ParameterType< P2 >::PassingType p2 )
198 object( const_cast< T* >( obj ) ),
199 memberFunction( member ),
208 virtual ~MessageValue2()
213 * @copydoc MessageBase::Process
215 virtual void Process( BufferIndex /*bufferIndex*/ )
217 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
218 (object->*memberFunction)(
219 ParameterType< P1 >::PassObject( param1 ),
220 ParameterType< P2 >::PassObject( param2 ) );
226 MemberFunction memberFunction;
227 typename ParameterType< P1 >::HolderType param1;
228 typename ParameterType< P2 >::HolderType param2;
233 * Templated message which calls a member function of an object.
234 * This overload passes three value-type parameters.
235 * Template parameters need to match the MemberFunction!
236 * The message will contain copy of the value (in case of & or const&)
238 template< typename T, typename P1, typename P2, typename P3 >
239 class MessageValue3 : public MessageBase
243 typedef void(T::*MemberFunction)(
244 typename ParameterType< P1 >::PassingType,
245 typename ParameterType< P2 >::PassingType,
246 typename ParameterType< P3 >::PassingType );
250 * @note The object is expected to be const in the thread which sends this message.
251 * However it can be modified when Process() is called in a different thread.
252 * @param[in] obj The object.
253 * @param[in] member The member function of the object.
254 * @param[in] p1 The first parameter to pass to the member function.
255 * @param[in] p2 The second parameter to pass to the member function.
256 * @param[in] p3 The third parameter to pass to the member function.
258 MessageValue3( const T* obj,
259 MemberFunction member,
260 typename ParameterType< P1 >::PassingType p1,
261 typename ParameterType< P2 >::PassingType p2,
262 typename ParameterType< P3 >::PassingType p3 )
264 object( const_cast< T* >( obj ) ),
265 memberFunction( member ),
275 virtual ~MessageValue3()
280 * @copydoc MessageBase::Process
282 virtual void Process( BufferIndex /*bufferIndex*/ )
284 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
285 (object->*memberFunction)(
286 ParameterType< P1 >::PassObject( param1 ),
287 ParameterType< P2 >::PassObject( param2 ),
288 ParameterType< P3 >::PassObject( param3 ) );
294 MemberFunction memberFunction;
295 typename ParameterType< P1 >::HolderType param1;
296 typename ParameterType< P2 >::HolderType param2;
297 typename ParameterType< P3 >::HolderType param3;
302 * Templated message which calls a member function of an object.
303 * This overload passes four value-type parameters.
304 * Template parameters need to match the MemberFunction!
305 * The message will contain copy of the value (in case of & or const&)
307 template< typename T, typename P1, typename P2, typename P3, typename P4 >
308 class MessageValue4 : public MessageBase
312 typedef void(T::*MemberFunction)(
313 typename ParameterType< P1 >::PassingType,
314 typename ParameterType< P2 >::PassingType,
315 typename ParameterType< P3 >::PassingType,
316 typename ParameterType< P4 >::PassingType );
320 * @note The object is expected to be const in the thread which sends this message.
321 * However it can be modified when Process() is called in a different thread.
322 * @param[in] obj The object.
323 * @param[in] member The member function of the object.
324 * @param[in] p1 The first parameter to pass to the member function.
325 * @param[in] p2 The second parameter to pass to the member function.
326 * @param[in] p3 The third parameter to pass to the member function.
327 * @param[in] p4 The fourth parameter to pass to the member function.
329 MessageValue4( const T* obj,
330 MemberFunction member,
331 typename ParameterType< P1 >::PassingType p1,
332 typename ParameterType< P2 >::PassingType p2,
333 typename ParameterType< P3 >::PassingType p3,
334 typename ParameterType< P4 >::PassingType p4 )
336 object( const_cast< T* >( obj ) ),
337 memberFunction( member ),
348 virtual ~MessageValue4()
353 * @copydoc MessageBase::Process
355 virtual void Process( BufferIndex /*bufferIndex*/ )
357 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
358 (object->*memberFunction)(
359 ParameterType< P1 >::PassObject( param1 ),
360 ParameterType< P2 >::PassObject( param2 ),
361 ParameterType< P3 >::PassObject( param3 ),
362 ParameterType< P4 >::PassObject( param4 ) );
368 MemberFunction memberFunction;
369 typename ParameterType< P1 >::HolderType param1;
370 typename ParameterType< P2 >::HolderType param2;
371 typename ParameterType< P3 >::HolderType param3;
372 typename ParameterType< P4 >::HolderType param4;
377 * Templated message which calls a member function of an object.
378 * This overload passes five value-type parameters.
379 * Template parameters need to match the MemberFunction!
380 * The message will contain copy of the value (in case of & or const&)
382 template< typename T, typename P1, typename P2, typename P3, typename P4, typename P5 >
383 class MessageValue5 : public MessageBase
387 typedef void(T::*MemberFunction)(
388 typename ParameterType< P1 >::PassingType,
389 typename ParameterType< P2 >::PassingType,
390 typename ParameterType< P3 >::PassingType,
391 typename ParameterType< P4 >::PassingType,
392 typename ParameterType< P5 >::PassingType );
396 * @note The object is expected to be const in the thread which sends this message.
397 * However it can be modified when Process() is called in a different thread.
398 * @param[in] obj The object.
399 * @param[in] member The member function of the object.
400 * @param[in] p1 The first parameter to pass to the member function.
401 * @param[in] p2 The second parameter to pass to the member function.
402 * @param[in] p3 The third parameter to pass to the member function.
403 * @param[in] p4 The fourth parameter to pass to the member function.
404 * @param[in] p5 The fifth parameter to pass to the member function.
406 MessageValue5( const T* obj,
407 MemberFunction member,
408 typename ParameterType< P1 >::PassingType p1,
409 typename ParameterType< P2 >::PassingType p2,
410 typename ParameterType< P3 >::PassingType p3,
411 typename ParameterType< P4 >::PassingType p4,
412 typename ParameterType< P5 >::PassingType p5 )
414 object( const_cast< T* >( obj ) ),
415 memberFunction( member ),
427 virtual ~MessageValue5()
432 * @copydoc MessageBase::Process
434 virtual void Process( BufferIndex /*bufferIndex*/ )
436 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
437 (object->*memberFunction)(
438 ParameterType< P1 >::PassObject( param1 ),
439 ParameterType< P2 >::PassObject( param2 ),
440 ParameterType< P3 >::PassObject( param3 ),
441 ParameterType< P4 >::PassObject( param4 ),
442 ParameterType< P5 >::PassObject( param5 ) );
449 MemberFunction memberFunction;
450 typename ParameterType< P1 >::HolderType param1;
451 typename ParameterType< P2 >::HolderType param2;
452 typename ParameterType< P3 >::HolderType param3;
453 typename ParameterType< P4 >::HolderType param4;
454 typename ParameterType< P5 >::HolderType param5;
459 * Templated message which calls a member function of an object.
460 * This overload passes a value-type to set a double-buffered property.
461 * Template parameters need to match the MemberFunction!
462 * The message will contain copy of the value (in case of & or const&)
464 template< typename T, typename P >
465 class MessageDoubleBuffered1 : public MessageBase
469 typedef void(T::*MemberFunction)(
471 typename ParameterType< P >::PassingType );
475 * @note The object is expected to be const in the thread which sends this message.
476 * However it can be modified when Process() is called in a different thread.
477 * @param[in] obj The object.
478 * @param[in] member The member function of the object.
479 * @param[in] p The second parameter to pass.
481 MessageDoubleBuffered1( const T* obj,
482 MemberFunction member,
483 typename ParameterType< P >::PassingType p )
485 object( const_cast< T* >( obj ) ),
486 memberFunction( member ),
494 virtual ~MessageDoubleBuffered1()
499 * @copydoc MessageBase::Process
501 virtual void Process( BufferIndex bufferIndex )
503 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
504 (object->*memberFunction)(
506 ParameterType< P >::PassObject( param ) );
512 MemberFunction memberFunction;
513 typename ParameterType< P >::HolderType param;
518 * Templated message which calls a member function of an object.
519 * This overload passes two value-types to set double-buffered properties.
520 * Template parameters need to match the MemberFunction!
521 * The message will contain copy of the value (in case of & or const&)
523 template< typename T, typename P2, typename P3 >
524 class MessageDoubleBuffered2 : public MessageBase
528 typedef void(T::*MemberFunction)(
530 typename ParameterType< P2 >::PassingType,
531 typename ParameterType< P3 >::PassingType );
535 * @note The object is expected to be const in the thread which sends this message.
536 * However it can be modified when Process() is called in a different thread.
537 * @param[in] obj The object.
538 * @param[in] member The member function of the object.
539 * @param[in] p2 The second parameter to pass to the function.
540 * @param[in] p3 The third parameter to pass to the function.
542 MessageDoubleBuffered2( const T* obj,
543 MemberFunction member,
544 typename ParameterType< P2 >::PassingType p2,
545 typename ParameterType< P3 >::PassingType p3 )
547 object( const_cast< T* >( obj ) ),
548 memberFunction( member ),
557 virtual ~MessageDoubleBuffered2()
562 * @copydoc MessageBase::Process
564 virtual void Process( BufferIndex bufferIndex )
566 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
567 (object->*memberFunction)(
569 ParameterType< P2 >::PassObject( param2 ),
570 ParameterType< P3 >::PassObject( param3 ) );
576 MemberFunction memberFunction;
577 typename ParameterType< P2 >::HolderType param2;
578 typename ParameterType< P3 >::HolderType param3;
584 * Templated message which calls a member function of an object.
585 * This overload passes three value-types to set double-buffered properties.
586 * Template parameters need to match the MemberFunction!
587 * The message will contain copy of the value (in case of & or const&)
589 template< typename T, typename P2, typename P3, typename P4 >
590 class MessageDoubleBuffered3 : public MessageBase
594 typedef void(T::*MemberFunction)(
596 typename ParameterType< P2 >::PassingType,
597 typename ParameterType< P3 >::PassingType,
598 typename ParameterType< P4 >::PassingType );
602 * @note The object is expected to be const in the thread which sends this message.
603 * However it can be modified when Process() is called in a different thread.
604 * @param[in] obj The object.
605 * @param[in] member The member function of the object.
606 * @param[in] p2 The second parameter to pass.
607 * @param[in] p3 The third parameter to pass.
608 * @param[in] p4 The forth parameter to pass.
610 MessageDoubleBuffered3( const T* obj,
611 MemberFunction member,
612 typename ParameterType< P2 >::PassingType p2,
613 typename ParameterType< P3 >::PassingType p3,
614 typename ParameterType< P4 >::PassingType p4 )
616 object( const_cast< T* >( obj ) ),
617 memberFunction( member ),
627 virtual ~MessageDoubleBuffered3()
632 * @copydoc MessageBase::Process
634 virtual void Process( BufferIndex bufferIndex )
636 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
637 (object->*memberFunction)(
639 ParameterType< P2 >::PassObject( param2 ),
640 ParameterType< P3 >::PassObject( param3 ),
641 ParameterType< P4 >::PassObject( param4 ) );
647 MemberFunction memberFunction;
648 typename ParameterType< P2 >::HolderType param2;
649 typename ParameterType< P3 >::HolderType param3;
650 typename ParameterType< P4 >::HolderType param4;
655 * Templated message which calls a member function of an object.
656 * This overload passes four value-types to set double-buffered properties.
657 * Template parameters need to match the MemberFunction!
658 * The message will contain copy of the value (in case of & or const&)
660 template< typename T, typename P2, typename P3, typename P4, typename P5 >
661 class MessageDoubleBuffered4 : public MessageBase
665 typedef void(T::*MemberFunction)(
667 typename ParameterType< P2 >::PassingType,
668 typename ParameterType< P3 >::PassingType,
669 typename ParameterType< P4 >::PassingType,
670 typename ParameterType< P5 >::PassingType );
674 * @note The object is expected to be const in the thread which sends this message.
675 * However it can be modified when Process() is called in a different thread.
676 * @param[in] obj The object.
677 * @param[in] member The member function of the object.
678 * @param[in] p2 The second parameter to pass.
679 * @param[in] p3 The third parameter to pass.
680 * @param[in] p4 The forth parameter to pass.
681 * @param[in] p5 The fifth parameter to pass.
683 MessageDoubleBuffered4( const T* obj,
684 MemberFunction member,
685 typename ParameterType< P2 >::PassingType p2,
686 typename ParameterType< P3 >::PassingType p3,
687 typename ParameterType< P4 >::PassingType p4,
688 typename ParameterType< P5 >::PassingType p5 )
690 object( const_cast< T* >( obj ) ),
691 memberFunction( member ),
702 virtual ~MessageDoubleBuffered4()
707 * @copydoc MessageBase::Process
709 virtual void Process( BufferIndex bufferIndex )
711 DALI_ASSERT_DEBUG( object && "Message does not have an object" );
712 (object->*memberFunction)(
714 ParameterType< P2 >::PassObject( param2 ),
715 ParameterType< P3 >::PassObject( param3 ),
716 ParameterType< P4 >::PassObject( param4 ),
717 ParameterType< P5 >::PassObject( param5 ) );
723 MemberFunction memberFunction;
724 typename ParameterType< P2 >::HolderType param2;
725 typename ParameterType< P3 >::HolderType param3;
726 typename ParameterType< P4 >::HolderType param4;
727 typename ParameterType< P5 >::HolderType param5;
731 } // namespace Internal
735 #endif // __DALI_INTERNAL_MESSAGE_H__