summaryrefslogtreecommitdiff
path: root/include/utils/Pool.h
diff options
context:
space:
mode:
author Jeff Brown <jeffbrown@google.com> 2010-06-13 17:55:28 -0700
committer Android Git Automerger <android-git-automerger@android.com> 2010-06-13 17:55:28 -0700
commit7c8aa44f320f45e8417f0aba9ca67af6a67a5cf7 (patch)
tree2d547d9d8ddc5b08310070121616294d92ebca70 /include/utils/Pool.h
parent94f14aeca9e6c6d07b39a7f708eacadcfeb6fbd2 (diff)
parent46b9ac0ae2162309774a7478cd9d4e578747bfc2 (diff)
am 46b9ac0a: Native input dispatch rewrite work in progress.
Merge commit '46b9ac0ae2162309774a7478cd9d4e578747bfc2' into gingerbread * commit '46b9ac0ae2162309774a7478cd9d4e578747bfc2': Native input dispatch rewrite work in progress.
Diffstat (limited to 'include/utils/Pool.h')
-rw-r--r--include/utils/Pool.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/include/utils/Pool.h b/include/utils/Pool.h
new file mode 100644
index 000000000000..2ee768eef1aa
--- /dev/null
+++ b/include/utils/Pool.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef UTILS_POOL_H
+#define UTILS_POOL_H
+
+#include <utils/TypeHelpers.h>
+
+namespace android {
+
+class PoolImpl {
+public:
+ PoolImpl(size_t objSize);
+ ~PoolImpl();
+
+ void* allocImpl();
+ void freeImpl(void* obj);
+
+private:
+ size_t mObjSize;
+};
+
+/*
+ * A homogeneous typed memory pool for fixed size objects.
+ * Not intended to be thread-safe.
+ */
+template<typename T>
+class Pool : private PoolImpl {
+public:
+ /* Creates an initially empty pool. */
+ Pool() : PoolImpl(sizeof(T)) { }
+
+ /* Destroys the pool.
+ * Assumes that the pool is empty. */
+ ~Pool() { }
+
+ /* Allocates an object from the pool, growing the pool if needed. */
+ inline T* alloc() {
+ void* mem = allocImpl();
+ if (! traits<T>::has_trivial_ctor) {
+ return new (mem) T();
+ } else {
+ return static_cast<T*>(mem);
+ }
+ }
+
+ /* Frees an object from the pool. */
+ inline void free(T* obj) {
+ if (! traits<T>::has_trivial_dtor) {
+ obj->~T();
+ }
+ freeImpl(obj);
+ }
+};
+
+} // namespace android
+
+#endif // UTILS_POOL_H