diff --git a/include/utils/BitSet.h b/include/utils/BitSet.h index 9452e86d6..e189d0c73 100644 --- a/include/utils/BitSet.h +++ b/include/utils/BitSet.h @@ -18,6 +18,7 @@ #define UTILS_BITSET_H #include +#include /* * 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 85535bd61..20575ee3e 100644 --- a/include/utils/KeyedVector.h +++ b/include/utils/KeyedVector.h @@ -91,6 +91,13 @@ private: SortedVector< key_value_pair_t > mVector; }; +// KeyedVector can be trivially moved using memcpy() because its +// underlying SortedVector can be trivially moved. +template struct trait_trivial_move > { + enum { value = trait_trivial_move > >::value }; +}; + + // --------------------------------------------------------------------------- /** diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h index c7a9b7895..99f51820a 100644 --- a/include/utils/RefBase.h +++ b/include/utils/RefBase.h @@ -25,6 +25,7 @@ #include #include +#include // --------------------------------------------------------------------------- namespace android { diff --git a/include/utils/SortedVector.h b/include/utils/SortedVector.h index 0e98aeb05..24455253c 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 can be trivially moved using memcpy() because moving does not +// require any change to the underlying SharedBuffer contents or reference count. +template struct trait_trivial_move > { enum { value = true }; }; // --------------------------------------------------------------------------- // No user serviceable parts from here... diff --git a/include/utils/String16.h b/include/utils/String16.h index 360f407c3..fe06c576f 100644 --- a/include/utils/String16.h +++ b/include/utils/String16.h @@ -20,6 +20,7 @@ #include #include #include +#include // --------------------------------------------------------------------------- @@ -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 4163697d2..335e7f1bf 100644 --- a/include/utils/String8.h +++ b/include/utils/String8.h @@ -20,6 +20,7 @@ #include #include #include +#include #include // for strcmp #include @@ -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 1f2c2d5fd..2bf33c332 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 5b5296bdb..e39a5b759 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 can be trivially moved using memcpy() because moving does not +// require any change to the underlying SharedBuffer contents or reference count. +template struct trait_trivial_move > { enum { value = true }; }; // --------------------------------------------------------------------------- // No user serviceable parts from here...