1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_TYPE_HELPERS_H 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_TYPE_HELPERS_H 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <new> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Types traits 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 325f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 335f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_ctor { enum { value = false }; }; 345f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_dtor { enum { value = false }; }; 355f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_copy { enum { value = false }; }; 365f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_move { enum { value = false }; }; 375f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_pointer { enum { value = false }; }; 385f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_pointer<T*> { enum { value = true }; }; 395f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename TYPE> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct traits { 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 435f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian // whether this type is a pointer 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project is_pointer = trait_pointer<TYPE>::value, 455f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian // whether this type's constructor is a no-op 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project has_trivial_ctor = is_pointer || trait_trivial_ctor<TYPE>::value, 475f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian // whether this type's destructor is a no-op 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project has_trivial_dtor = is_pointer || trait_trivial_dtor<TYPE>::value, 495f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian // whether this type type can be copy-constructed with memcpy 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project has_trivial_copy = is_pointer || trait_trivial_copy<TYPE>::value, 515f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian // whether this type can be moved with memmove 525f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian has_trivial_move = is_pointer || trait_trivial_move<TYPE>::value 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename T, typename U> 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct aggregate_traits { 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project enum { 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project is_pointer = false, 605f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian has_trivial_ctor = 615f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor, 625f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian has_trivial_dtor = 635f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor, 645f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian has_trivial_copy = 655f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian traits<T>::has_trivial_copy && traits<U>::has_trivial_copy, 665f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian has_trivial_move = 675f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian traits<T>::has_trivial_move && traits<U>::has_trivial_move 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project }; 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 71e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 72e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown template<> struct trait_trivial_ctor< T > { enum { value = true }; }; 73e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 74e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 75e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown template<> struct trait_trivial_dtor< T > { enum { value = true }; }; 76e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 77e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 78e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown template<> struct trait_trivial_copy< T > { enum { value = true }; }; 79e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 80e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_MOVE_TRAIT( T ) \ 815f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian template<> struct trait_trivial_move< T > { enum { value = true }; }; 825f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 83e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_BASIC_TYPES_TRAITS( T ) \ 84e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 85e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 86e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 87e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown ANDROID_TRIVIAL_MOVE_TRAIT( T ) 88e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * basic types traits 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 945f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 955f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( void ) 965f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( bool ) 975f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( char ) 985f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned char ) 995f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( short ) 1005f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned short ) 1015f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( int ) 1025f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned int ) 1035f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long ) 1045f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long ) 1055f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long long ) 1065f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long long ) 1075f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( float ) 1085f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( double ) 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 1125f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * compare and order types 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) { 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (lhs < rhs) ? 1 : 0; 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) { 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 1285f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian * create, destroy, copy and move types... 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 1305f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) { 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_ctor) { 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new(p++) TYPE; 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid destroy_type(TYPE* p, size_t n) { 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p->~TYPE(); 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project p++; 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) { 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new(d) TYPE(*s); 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d++, s++; 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project memcpy(d,s,n*sizeof(TYPE)); 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) { 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new(where) TYPE(*what); 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project where++; 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1705f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian while (n--) { 1715f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian *where++ = *what; 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) { 1785f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 1795f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian || traits<TYPE>::has_trivial_move) 1805f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian { 1815f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian memmove(d,s,n*sizeof(TYPE)); 1825f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian } else { 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d += n; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s += n; 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project --d, --s; 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new(d) TYPE(*s); 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 1905f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian *d = *s; 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->~TYPE(); 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) { 2015f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 2025f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian || traits<TYPE>::has_trivial_move) 2035f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian { 2045f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian memmove(d,s,n*sizeof(TYPE)); 2055f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian } else { 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (n--) { 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project new(d) TYPE(*s); 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 2105f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian *d = *s; 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project s->~TYPE(); 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project d++, s++; 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2195f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * a key/value pair 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename KEY, typename VALUE> 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct key_value_pair_t { 22866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown typedef KEY key_t; 22966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown typedef VALUE value_t; 23066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project KEY key; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project VALUE value; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project key_value_pair_t() { } 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { } 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v) { } 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project key_value_pair_t(const KEY& k) : key(k) { } 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project inline bool operator < (const key_value_pair_t& o) const { 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return strictly_order_type(key, o.key); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 24066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown inline const KEY& getKey() const { 24166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown return key; 24266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown } 24366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown inline const VALUE& getValue() const { 24466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown return value; 24566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown } 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V> 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> > 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V> 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> > 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V> 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> > 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V> 2585f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopianstruct trait_trivial_move< key_value_pair_t<K, V> > 2595f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian{ enum { value = aggregate_traits<K,V>::has_trivial_move }; }; 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown/* 26466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown * Hash codes. 26566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown */ 26666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntypedef uint32_t hash_t; 26766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 26866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntemplate <typename TKey> 26966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brownhash_t hash_type(const TKey& key); 27066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 27166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown/* Built-in hash code specializations. 27266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown * Assumes pointers are 32bit. */ 27366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_INT32_HASH(T) \ 27466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown template <> inline hash_t hash_type(const T& value) { return hash_t(value); } 27566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_INT64_HASH(T) \ 27666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown template <> inline hash_t hash_type(const T& value) { \ 27766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown return hash_t((value >> 32) ^ value); } 27866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_REINTERPRET_HASH(T, R) \ 27966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown template <> inline hash_t hash_type(const T& value) { \ 28066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown return hash_type(*reinterpret_cast<const R*>(&value)); } 28166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 28266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_INT32_HASH(bool) 28348585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int8_t) 28448585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint8_t) 28548585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int16_t) 28648585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint16_t) 28748585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int32_t) 28848585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint32_t) 28948585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT64_HASH(int64_t) 29048585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT64_HASH(uint64_t) 29166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_REINTERPRET_HASH(float, uint32_t) 29266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_REINTERPRET_HASH(double, uint64_t) 29366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 29466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntemplate <typename T> inline hash_t hash_type(const T*& value) { 29566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown return hash_type(uintptr_t(value)); 29666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown} 29766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_TYPE_HELPERS_H 303