[dali_1.0.1] Merge branch 'tizen'
[platform/core/uifw/dali-core.git] / dali / internal / common / message-buffer.h
1 #ifndef __DALI_INTERNAL_MESSAGE_BUFFER_H__
2 #define __DALI_INTERNAL_MESSAGE_BUFFER_H__
3
4 /*
5  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
6  *
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
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <cstddef>
23
24 namespace Dali
25 {
26
27 namespace Internal
28 {
29
30 /**
31  * Utility class to reserve a buffer for storing messages.
32  */
33 class MessageBuffer
34 {
35 public:
36
37   /**
38    * Create a new MessageBuffer
39    * @param[in] The smallest capacity which the buffer will allocate, with respect to the size of type "char".
40    * @note The buffer will not allocate memory until the first call to ReserveMessageSlot().
41    */
42   MessageBuffer( std::size_t initialCapacity );
43
44   /**
45    * Non-virtual destructor; not suitable as a base class
46    */
47   ~MessageBuffer();
48
49   /**
50    * Reserve space for another message in the buffer.
51    * @pre size is greater than zero.
52    * @param[in] The message size with respect to the size of type "char".
53    * @return A pointer to the address allocated for the message.
54    */
55   unsigned int* ReserveMessageSlot( std::size_t size );
56
57   /**
58    * Query the capacity of the message buffer.
59    * @return The capacity with respect to the size of type "char".
60    */
61   std::size_t GetCapacity() const;
62
63   /**
64    * Used to iterate though the messages in the buffer.
65    */
66   class Iterator
67   {
68   public:
69
70     // Constructor
71     Iterator(unsigned int* current);
72
73     // Inlined for performance
74     bool IsValid()
75     {
76       // Valid until end marker has been found
77       return 0 != mMessageSize;
78     }
79
80     // Inlined for performance
81     unsigned int* Get()
82     {
83       return ( 0 != mMessageSize ) ? mCurrent : NULL;
84     }
85
86     // Inlined for performance
87     void Next()
88     {
89       // Jump to next object and read size
90       mCurrent += mMessageSize;
91       mMessageSize = *mCurrent++;
92     }
93
94     // Copy constructor
95     Iterator(const Iterator& copy);
96
97   private:
98
99     // Undefined
100     Iterator& operator=(const Iterator& rhs);
101
102   private:
103
104     unsigned int* mCurrent;
105     unsigned int mMessageSize;
106   };
107
108   /**
109    * Returns an iterator to the first message in the buffer.
110    * There is no past-the-end iterator; use Iterator::IsValid() to determine when the has been reached.
111    * @note Adding more messages with ReserveMessageSlot() may corrupt this iterator.
112    * @return The iterator.
113    */
114   Iterator Begin() const;
115
116   /**
117    * Sets the size of the buffer to zero (does not deallocate memory)
118    */
119   void Reset();
120
121 private:
122
123   // Undefined
124   MessageBuffer(const MessageBuffer&);
125
126   // Undefined
127   MessageBuffer& operator=(const MessageBuffer& rhs);
128
129   /**
130    * Helper to increase the capacity of the buffer.
131    * @pre The newCapacity is greater than mCapacity.
132    * @param[in] The newCapacity
133    */
134   void IncreaseCapacity( std::size_t newCapacity );
135
136 private:
137
138   std::size_t mInitialCapacity; ///< The capacity to allocate during first call to ReserveMessageSlot
139
140   unsigned int* mData;     ///< The data allocated for the message buffer
141   unsigned int* mNextSlot; ///< The next free location in the buffer
142
143   std::size_t mCapacity; ///< The memory allocated with respect to sizeof(unsigned int)
144   std::size_t mSize;     ///< The memory reserved for messages with respect to sizeof(unsigned int)
145 };
146
147 } // namespace Internal
148
149 } // namespace Dali
150
151 #endif // __DALI_INTERNAL_MESSAGE_BUFFER_H__