1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License. 6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at 7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and 14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License. 15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef ANDROID_TYPE_HELPERS_H 18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define ANDROID_TYPE_HELPERS_H 19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 20cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <new> 21cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <stdint.h> 22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <string.h> 23cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <sys/types.h> 24cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 26cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 27cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android { 28cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 29cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 30cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Types traits 31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 32a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 33a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_trivial_ctor { enum { value = false }; }; 34a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_trivial_dtor { enum { value = false }; }; 35a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_trivial_copy { enum { value = false }; }; 36a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_trivial_move { enum { value = false }; }; 37a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_pointer { enum { value = false }; }; 38a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopiantemplate <typename T> struct trait_pointer<T*> { enum { value = true }; }; 39a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename TYPE> 41cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct traits { 42cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project enum { 43a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian // whether this type is a pointer 44cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project is_pointer = trait_pointer<TYPE>::value, 45a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian // whether this type's constructor is a no-op 46cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project has_trivial_ctor = is_pointer || trait_trivial_ctor<TYPE>::value, 47a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian // whether this type's destructor is a no-op 48cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project has_trivial_dtor = is_pointer || trait_trivial_dtor<TYPE>::value, 49a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian // whether this type type can be copy-constructed with memcpy 50cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project has_trivial_copy = is_pointer || trait_trivial_copy<TYPE>::value, 51a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian // whether this type can be moved with memmove 52a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian has_trivial_move = is_pointer || trait_trivial_move<TYPE>::value 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project }; 54cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename T, typename U> 57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct aggregate_traits { 58cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project enum { 59cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project is_pointer = false, 60a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian has_trivial_ctor = 61a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor, 62a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian has_trivial_dtor = 63a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor, 64a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian has_trivial_copy = 65a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian traits<T>::has_trivial_copy && traits<U>::has_trivial_copy, 66a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian has_trivial_move = 67a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian traits<T>::has_trivial_move && traits<U>::has_trivial_move 68cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project }; 69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 70cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 719a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#define ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 729a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown template<> struct trait_trivial_ctor< T > { enum { value = true }; }; 739a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 749a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#define ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 759a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown template<> struct trait_trivial_dtor< T > { enum { value = true }; }; 769a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 779a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#define ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 789a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown template<> struct trait_trivial_copy< T > { enum { value = true }; }; 799a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 809a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#define ANDROID_TRIVIAL_MOVE_TRAIT( T ) \ 81a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian template<> struct trait_trivial_move< T > { enum { value = true }; }; 82a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 839a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#define ANDROID_BASIC_TYPES_TRAITS( T ) \ 849a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 859a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 869a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 879a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown ANDROID_TRIVIAL_MOVE_TRAIT( T ) 889a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 89cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 90cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 91cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 92cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * basic types traits 93cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 94a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 95a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( void ) 96a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( bool ) 97a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( char ) 98a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned char ) 99a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( short ) 100a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned short ) 101a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( int ) 102a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned int ) 103a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long ) 104a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long ) 105a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long long ) 106a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long long ) 107a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( float ) 108a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias AgopianANDROID_BASIC_TYPES_TRAITS( double ) 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 112a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * compare and order types 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 116cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) { 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return (lhs < rhs) ? 1 : 0; 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 123cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) { 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs); 125cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 128a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian * create, destroy, copy and move types... 129cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 130a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) { 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_ctor) { 13458bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 13558bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 136cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project new(p++) TYPE; 137cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 138cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 139cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 140cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid destroy_type(TYPE* p, size_t n) { 143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 14458bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 14558bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 146cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project p->~TYPE(); 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project p++; 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) { 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 15558bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 15658bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project new(d) TYPE(*s); 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project d++, s++; 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else { 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project memcpy(d,s,n*sizeof(TYPE)); 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) { 167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 16858bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 16958bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project new(where) TYPE(*what); 171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project where++; 172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else { 17458bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 17558bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 176a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian *where++ = *what; 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) { 183a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 184a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian || traits<TYPE>::has_trivial_move) 185a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian { 186a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian memmove(d,s,n*sizeof(TYPE)); 187a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian } else { 188cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project d += n; 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project s += n; 19058bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 19158bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project --d, --s; 193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project new(d) TYPE(*s); 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else { 196a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian *d = *s; 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project s->~TYPE(); 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate<typename TYPE> inline 206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) { 207a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 208a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian || traits<TYPE>::has_trivial_move) 209a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian { 210a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian memmove(d,s,n*sizeof(TYPE)); 211a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian } else { 21258bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich while (n > 0) { 21358bf572aa2060ad30a8e46dd0b4a5cf9bb748f85Nick Kralevich n--; 214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project new(d) TYPE(*s); 216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } else { 217a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian *d = *s; 218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project s->~TYPE(); 221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project d++, s++; 223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 226a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian 227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * a key/value pair 231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 232cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 233cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename KEY, typename VALUE> 234cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct key_value_pair_t { 235e735f23018b398f45bd052b63616d7a45e29515bJeff Brown typedef KEY key_t; 236e735f23018b398f45bd052b63616d7a45e29515bJeff Brown typedef VALUE value_t; 237e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project KEY key; 239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project VALUE value; 240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project key_value_pair_t() { } 241cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { } 242cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v) { } 243cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project key_value_pair_t(const KEY& k) : key(k) { } 244cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator < (const key_value_pair_t& o) const { 245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strictly_order_type(key, o.key); 246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project } 247e735f23018b398f45bd052b63616d7a45e29515bJeff Brown inline const KEY& getKey() const { 248e735f23018b398f45bd052b63616d7a45e29515bJeff Brown return key; 249e735f23018b398f45bd052b63616d7a45e29515bJeff Brown } 250e735f23018b398f45bd052b63616d7a45e29515bJeff Brown inline const VALUE& getValue() const { 251e735f23018b398f45bd052b63616d7a45e29515bJeff Brown return value; 252e735f23018b398f45bd052b63616d7a45e29515bJeff Brown } 253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename K, typename V> 256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> > 257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; 258cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename K, typename V> 259cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> > 260cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; 261cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename K, typename V> 262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> > 263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; 264cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projecttemplate <typename K, typename V> 265a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopianstruct trait_trivial_move< key_value_pair_t<K, V> > 266a33bd1672fab3ac2ca72f2921716bf860d500aa3Mathias Agopian{ enum { value = aggregate_traits<K,V>::has_trivial_move }; }; 267cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 268cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 269cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 270e735f23018b398f45bd052b63616d7a45e29515bJeff Brown/* 271e735f23018b398f45bd052b63616d7a45e29515bJeff Brown * Hash codes. 272e735f23018b398f45bd052b63616d7a45e29515bJeff Brown */ 273e735f23018b398f45bd052b63616d7a45e29515bJeff Browntypedef uint32_t hash_t; 274e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 275e735f23018b398f45bd052b63616d7a45e29515bJeff Browntemplate <typename TKey> 276e735f23018b398f45bd052b63616d7a45e29515bJeff Brownhash_t hash_type(const TKey& key); 277e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 278e735f23018b398f45bd052b63616d7a45e29515bJeff Brown/* Built-in hash code specializations. 279e735f23018b398f45bd052b63616d7a45e29515bJeff Brown * Assumes pointers are 32bit. */ 280e735f23018b398f45bd052b63616d7a45e29515bJeff Brown#define ANDROID_INT32_HASH(T) \ 281e735f23018b398f45bd052b63616d7a45e29515bJeff Brown template <> inline hash_t hash_type(const T& value) { return hash_t(value); } 282e735f23018b398f45bd052b63616d7a45e29515bJeff Brown#define ANDROID_INT64_HASH(T) \ 283e735f23018b398f45bd052b63616d7a45e29515bJeff Brown template <> inline hash_t hash_type(const T& value) { \ 284e735f23018b398f45bd052b63616d7a45e29515bJeff Brown return hash_t((value >> 32) ^ value); } 285e735f23018b398f45bd052b63616d7a45e29515bJeff Brown#define ANDROID_REINTERPRET_HASH(T, R) \ 286e735f23018b398f45bd052b63616d7a45e29515bJeff Brown template <> inline hash_t hash_type(const T& value) { \ 287e735f23018b398f45bd052b63616d7a45e29515bJeff Brown return hash_type(*reinterpret_cast<const R*>(&value)); } 288e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 289e735f23018b398f45bd052b63616d7a45e29515bJeff BrownANDROID_INT32_HASH(bool) 290142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(int8_t) 291142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(uint8_t) 292142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(int16_t) 293142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(uint16_t) 294142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(int32_t) 295142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT32_HASH(uint32_t) 296142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT64_HASH(int64_t) 297142dbcd817ac7960061735e5e7ea174e0938fb09Jeff BrownANDROID_INT64_HASH(uint64_t) 298e735f23018b398f45bd052b63616d7a45e29515bJeff BrownANDROID_REINTERPRET_HASH(float, uint32_t) 299e735f23018b398f45bd052b63616d7a45e29515bJeff BrownANDROID_REINTERPRET_HASH(double, uint64_t) 300e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 301b6ea175b6b4d0aaac85ed6cd8ccac01ab896486bRaph Levientemplate <typename T> inline hash_t hash_type(T* const & value) { 302e735f23018b398f45bd052b63616d7a45e29515bJeff Brown return hash_type(uintptr_t(value)); 303e735f23018b398f45bd052b63616d7a45e29515bJeff Brown} 304e735f23018b398f45bd052b63616d7a45e29515bJeff Brown 305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; // namespace android 306cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 307cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 308cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 309cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_TYPE_HELPERS_H 310