summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/utils/BitSet.h3
-rw-r--r--include/utils/KeyedVector.h7
-rw-r--r--include/utils/RefBase.h1
-rw-r--r--include/utils/SortedVector.h3
-rw-r--r--include/utils/String16.h5
-rw-r--r--include/utils/String8.h5
-rw-r--r--include/utils/TypeHelpers.h20
-rw-r--r--include/utils/Vector.h3
8 files changed, 43 insertions, 4 deletions
diff --git a/include/utils/BitSet.h b/include/utils/BitSet.h
index 9452e86..e189d0c 100644
--- a/include/utils/BitSet.h
+++ b/include/utils/BitSet.h
@@ -18,6 +18,7 @@
#define UTILS_BITSET_H
#include <stdint.h>
+#include <utils/TypeHelpers.h>
/*
* Contains some bit manipulation helpers.
@@ -102,6 +103,8 @@ struct BitSet32 {
inline bool operator!= (const BitSet32& other) const { return value != other.value; }
};
+ANDROID_BASIC_TYPES_TRAITS(BitSet32)
+
} // namespace android
#endif // UTILS_BITSET_H
diff --git a/include/utils/KeyedVector.h b/include/utils/KeyedVector.h
index 85535bd..20575ee 100644
--- a/include/utils/KeyedVector.h
+++ b/include/utils/KeyedVector.h
@@ -91,6 +91,13 @@ private:
SortedVector< key_value_pair_t<KEY, VALUE> > mVector;
};
+// KeyedVector<KEY, VALUE> can be trivially moved using memcpy() because its
+// underlying SortedVector can be trivially moved.
+template<typename KEY, typename VALUE> struct trait_trivial_move<KeyedVector<KEY, VALUE> > {
+ enum { value = trait_trivial_move<SortedVector< key_value_pair_t<KEY, VALUE> > >::value };
+};
+
+
// ---------------------------------------------------------------------------
/**
diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h
index c7a9b78..99f5182 100644
--- a/include/utils/RefBase.h
+++ b/include/utils/RefBase.h
@@ -25,6 +25,7 @@
#include <string.h>
#include <utils/StrongPointer.h>
+#include <utils/TypeHelpers.h>
// ---------------------------------------------------------------------------
namespace android {
diff --git a/include/utils/SortedVector.h b/include/utils/SortedVector.h
index 0e98aeb..2445525 100644
--- a/include/utils/SortedVector.h
+++ b/include/utils/SortedVector.h
@@ -133,6 +133,9 @@ protected:
virtual int do_compare(const void* lhs, const void* rhs) const;
};
+// SortedVector<T> can be trivially moved using memcpy() because moving does not
+// require any change to the underlying SharedBuffer contents or reference count.
+template<typename T> struct trait_trivial_move<SortedVector<T> > { enum { value = true }; };
// ---------------------------------------------------------------------------
// No user serviceable parts from here...
diff --git a/include/utils/String16.h b/include/utils/String16.h
index 360f407..fe06c57 100644
--- a/include/utils/String16.h
+++ b/include/utils/String16.h
@@ -20,6 +20,7 @@
#include <utils/Errors.h>
#include <utils/SharedBuffer.h>
#include <utils/Unicode.h>
+#include <utils/TypeHelpers.h>
// ---------------------------------------------------------------------------
@@ -112,6 +113,10 @@ private:
const char16_t* mString;
};
+// String16 can be trivially moved using memcpy() because moving does not
+// require any change to the underlying SharedBuffer contents or reference count.
+ANDROID_TRIVIAL_MOVE_TRAIT(String16)
+
TextOutput& operator<<(TextOutput& to, const String16& val);
// ---------------------------------------------------------------------------
diff --git a/include/utils/String8.h b/include/utils/String8.h
index 4163697..335e7f1 100644
--- a/include/utils/String8.h
+++ b/include/utils/String8.h
@@ -20,6 +20,7 @@
#include <utils/Errors.h>
#include <utils/SharedBuffer.h>
#include <utils/Unicode.h>
+#include <utils/TypeHelpers.h>
#include <string.h> // for strcmp
#include <stdarg.h>
@@ -219,6 +220,10 @@ private:
const char* mString;
};
+// String8 can be trivially moved using memcpy() because moving does not
+// require any change to the underlying SharedBuffer contents or reference count.
+ANDROID_TRIVIAL_MOVE_TRAIT(String8)
+
TextOutput& operator<<(TextOutput& to, const String16& val);
// ---------------------------------------------------------------------------
diff --git a/include/utils/TypeHelpers.h b/include/utils/TypeHelpers.h
index 1f2c2d5..2bf33c3 100644
--- a/include/utils/TypeHelpers.h
+++ b/include/utils/TypeHelpers.h
@@ -68,12 +68,24 @@ struct aggregate_traits {
};
};
-#define ANDROID_BASIC_TYPES_TRAITS( T ) \
- template<> struct trait_trivial_ctor< T > { enum { value = true }; }; \
- template<> struct trait_trivial_dtor< T > { enum { value = true }; }; \
- template<> struct trait_trivial_copy< T > { enum { value = true }; }; \
+#define ANDROID_TRIVIAL_CTOR_TRAIT( T ) \
+ template<> struct trait_trivial_ctor< T > { enum { value = true }; };
+
+#define ANDROID_TRIVIAL_DTOR_TRAIT( T ) \
+ template<> struct trait_trivial_dtor< T > { enum { value = true }; };
+
+#define ANDROID_TRIVIAL_COPY_TRAIT( T ) \
+ template<> struct trait_trivial_copy< T > { enum { value = true }; };
+
+#define ANDROID_TRIVIAL_MOVE_TRAIT( T ) \
template<> struct trait_trivial_move< T > { enum { value = true }; };
+#define ANDROID_BASIC_TYPES_TRAITS( T ) \
+ ANDROID_TRIVIAL_CTOR_TRAIT( T ) \
+ ANDROID_TRIVIAL_DTOR_TRAIT( T ) \
+ ANDROID_TRIVIAL_COPY_TRAIT( T ) \
+ ANDROID_TRIVIAL_MOVE_TRAIT( T )
+
// ---------------------------------------------------------------------------
/*
diff --git a/include/utils/Vector.h b/include/utils/Vector.h
index 5b5296b..e39a5b7 100644
--- a/include/utils/Vector.h
+++ b/include/utils/Vector.h
@@ -201,6 +201,9 @@ protected:
virtual void do_move_backward(void* dest, const void* from, size_t num) const;
};
+// Vector<T> can be trivially moved using memcpy() because moving does not
+// require any change to the underlying SharedBuffer contents or reference count.
+template<typename T> struct trait_trivial_move<Vector<T> > { enum { value = true }; };
// ---------------------------------------------------------------------------
// No user serviceable parts from here...