1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * TypeHelpers.h 3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright 2005 The Android Open Source Project 5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef ANDROID_TYPE_HELPERS_H 9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_TYPE_HELPERS_H 10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <new> 12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h> 13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h> 14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h> 15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android { 19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Types traits 22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_ctor { enum { value = false }; }; 25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_dtor { enum { value = false }; }; 26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_copy { enum { value = false }; }; 27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_assign{ enum { value = false }; }; 28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer { enum { value = false }; }; 30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer<T*> { enum { value = true }; }; 31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_BASIC_TYPES_TRAITS( T ) \ 33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_ctor< T > { enum { value = true }; }; \ 34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_dtor< T > { enum { value = true }; }; \ 35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_copy< T > { enum { value = true }; }; \ 36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_assign< T >{ enum { value = true }; }; 37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_TYPE_TRAITS( T, ctor, dtor, copy, assign ) \ 39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_ctor< T > { enum { value = ctor }; }; \ 40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_dtor< T > { enum { value = dtor }; }; \ 41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_copy< T > { enum { value = copy }; }; \ 42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project template<> struct trait_trivial_assign< T >{ enum { value = assign }; }; 43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename TYPE> 45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct traits { 46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project enum { 47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_pointer = trait_pointer<TYPE>::value, 48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_ctor = is_pointer || trait_trivial_ctor<TYPE>::value, 49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_dtor = is_pointer || trait_trivial_dtor<TYPE>::value, 50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_copy = is_pointer || trait_trivial_copy<TYPE>::value, 51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_assign = is_pointer || trait_trivial_assign<TYPE>::value 52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T, typename U> 56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct aggregate_traits { 57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project enum { 58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project is_pointer = false, 59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_ctor = traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor, 60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_dtor = traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor, 61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_copy = traits<T>::has_trivial_copy && traits<U>::has_trivial_copy, 62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project has_trivial_assign = traits<T>::has_trivial_assign && traits<U>::has_trivial_assign 63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project }; 64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * basic types traits 70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( void ); 73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( bool ); 74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( char ); 75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned char ); 76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( short ); 77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned short ); 78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( int ); 79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned int ); 80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long ); 81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long ); 82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long long ); 83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long long ); 84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( float ); 85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( double ); 86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * compare and order types 92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) { 96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return (lhs < rhs) ? 1 : 0; 97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) { 101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs); 102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * create, destroy, copy and assign types... 106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) { 110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_ctor) { 111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new(p++) TYPE; 113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid destroy_type(TYPE* p, size_t n) { 119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p->~TYPE(); 122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project p++; 123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) { 129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new(d) TYPE(*s); 132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d++, s++; 133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(d,s,n*sizeof(TYPE)); 136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid assign_type(TYPE* d, const TYPE* s, size_t n) { 141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_assign) { 142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d++ = *s++; 144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memcpy(d,s,n*sizeof(TYPE)); 147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) { 152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new(where) TYPE(*what); 155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project where++; 156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *where++ = *what; 160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) { 166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) { 167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d += n; 168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s += n; 169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project --d, --s; 171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new(d) TYPE(*s); 173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d = *s; 175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->~TYPE(); 178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memmove(d,s,n*sizeof(TYPE)); 182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline 186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) { 187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) { 188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project while (n--) { 189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_copy) { 190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project new(d) TYPE(*s); 191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *d = *s; 193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project if (!traits<TYPE>::has_trivial_dtor) { 195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project s->~TYPE(); 196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project d++, s++; 198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } else { 200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project memmove(d,s,n*sizeof(TYPE)); 201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project} 203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/* 206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * a key/value pair 207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */ 208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename KEY, typename VALUE> 210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct key_value_pair_t { 211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project KEY key; 212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project VALUE value; 213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_value_pair_t() { } 214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { } 215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v) { } 216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project key_value_pair_t(const KEY& k) : key(k) { } 217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project inline bool operator < (const key_value_pair_t& o) const { 218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project return strictly_order_type(key, o.key); 219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project } 220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; 221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<> 223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V> 224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> > 225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; 226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<> 227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V> 228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> > 229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; 230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<> 231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V> 232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> > 233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; 234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<> 235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V> 236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_assign< key_value_pair_t<K, V> > 237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_assign};}; 238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android 242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// --------------------------------------------------------------------------- 244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project 245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ANDROID_TYPE_HELPERS_H 246