10b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 20b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Copyright (C) 2013 The Android Open Source Project 30b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 40b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Licensed under the Apache License, Version 2.0 (the "License"); 50b575de8ed0b628d84d256f5846500b0385979bdTim Murray * you may not use this file except in compliance with the License. 60b575de8ed0b628d84d256f5846500b0385979bdTim Murray * You may obtain a copy of the License at 70b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 80b575de8ed0b628d84d256f5846500b0385979bdTim Murray * http://www.apache.org/licenses/LICENSE-2.0 90b575de8ed0b628d84d256f5846500b0385979bdTim Murray * 100b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Unless required by applicable law or agreed to in writing, software 110b575de8ed0b628d84d256f5846500b0385979bdTim Murray * distributed under the License is distributed on an "AS IS" BASIS, 120b575de8ed0b628d84d256f5846500b0385979bdTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b575de8ed0b628d84d256f5846500b0385979bdTim Murray * See the License for the specific language governing permissions and 140b575de8ed0b628d84d256f5846500b0385979bdTim Murray * limitations under the License. 150b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 160b575de8ed0b628d84d256f5846500b0385979bdTim Murray 170b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef ANDROID_TYPE_HELPERS_H 180b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_TYPE_HELPERS_H 190b575de8ed0b628d84d256f5846500b0385979bdTim Murray 200b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <new> 210b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <stdint.h> 220b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <string.h> 230b575de8ed0b628d84d256f5846500b0385979bdTim Murray#include <sys/types.h> 240b575de8ed0b628d84d256f5846500b0385979bdTim Murray 250b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 260b575de8ed0b628d84d256f5846500b0385979bdTim Murray 270b575de8ed0b628d84d256f5846500b0385979bdTim Murraynamespace android { 280b575de8ed0b628d84d256f5846500b0385979bdTim Murray 290b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 300b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Types traits 310b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 320b575de8ed0b628d84d256f5846500b0385979bdTim Murray 330b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_trivial_ctor { enum { value = false }; }; 340b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_trivial_dtor { enum { value = false }; }; 350b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_trivial_copy { enum { value = false }; }; 360b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_trivial_move { enum { value = false }; }; 370b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_pointer { enum { value = false }; }; 380b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> struct trait_pointer<T*> { enum { value = true }; }; 390b575de8ed0b628d84d256f5846500b0385979bdTim Murray 400b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename TYPE> 410b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct traits { 420b575de8ed0b628d84d256f5846500b0385979bdTim Murray enum { 430b575de8ed0b628d84d256f5846500b0385979bdTim Murray // whether this type is a pointer 440b575de8ed0b628d84d256f5846500b0385979bdTim Murray is_pointer = trait_pointer<TYPE>::value, 450b575de8ed0b628d84d256f5846500b0385979bdTim Murray // whether this type's constructor is a no-op 460b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_ctor = is_pointer || trait_trivial_ctor<TYPE>::value, 470b575de8ed0b628d84d256f5846500b0385979bdTim Murray // whether this type's destructor is a no-op 480b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_dtor = is_pointer || trait_trivial_dtor<TYPE>::value, 490b575de8ed0b628d84d256f5846500b0385979bdTim Murray // whether this type type can be copy-constructed with memcpy 500b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_copy = is_pointer || trait_trivial_copy<TYPE>::value, 510b575de8ed0b628d84d256f5846500b0385979bdTim Murray // whether this type can be moved with memmove 520b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_move = is_pointer || trait_trivial_move<TYPE>::value 530b575de8ed0b628d84d256f5846500b0385979bdTim Murray }; 540b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; 550b575de8ed0b628d84d256f5846500b0385979bdTim Murray 560b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T, typename U> 570b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct aggregate_traits { 580b575de8ed0b628d84d256f5846500b0385979bdTim Murray enum { 590b575de8ed0b628d84d256f5846500b0385979bdTim Murray is_pointer = false, 600b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_ctor = 610b575de8ed0b628d84d256f5846500b0385979bdTim Murray traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor, 620b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_dtor = 630b575de8ed0b628d84d256f5846500b0385979bdTim Murray traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor, 640b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_copy = 650b575de8ed0b628d84d256f5846500b0385979bdTim Murray traits<T>::has_trivial_copy && traits<U>::has_trivial_copy, 660b575de8ed0b628d84d256f5846500b0385979bdTim Murray has_trivial_move = 670b575de8ed0b628d84d256f5846500b0385979bdTim Murray traits<T>::has_trivial_move && traits<U>::has_trivial_move 680b575de8ed0b628d84d256f5846500b0385979bdTim Murray }; 690b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; 700b575de8ed0b628d84d256f5846500b0385979bdTim Murray 710b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 720b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<> struct trait_trivial_ctor< T > { enum { value = true }; }; 730b575de8ed0b628d84d256f5846500b0385979bdTim Murray 740b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 750b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<> struct trait_trivial_dtor< T > { enum { value = true }; }; 760b575de8ed0b628d84d256f5846500b0385979bdTim Murray 770b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 780b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<> struct trait_trivial_copy< T > { enum { value = true }; }; 790b575de8ed0b628d84d256f5846500b0385979bdTim Murray 800b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_TRIVIAL_MOVE_TRAIT( T ) \ 810b575de8ed0b628d84d256f5846500b0385979bdTim Murray template<> struct trait_trivial_move< T > { enum { value = true }; }; 820b575de8ed0b628d84d256f5846500b0385979bdTim Murray 830b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_BASIC_TYPES_TRAITS( T ) \ 840b575de8ed0b628d84d256f5846500b0385979bdTim Murray ANDROID_TRIVIAL_CTOR_TRAIT( T ) \ 850b575de8ed0b628d84d256f5846500b0385979bdTim Murray ANDROID_TRIVIAL_DTOR_TRAIT( T ) \ 860b575de8ed0b628d84d256f5846500b0385979bdTim Murray ANDROID_TRIVIAL_COPY_TRAIT( T ) \ 870b575de8ed0b628d84d256f5846500b0385979bdTim Murray ANDROID_TRIVIAL_MOVE_TRAIT( T ) 880b575de8ed0b628d84d256f5846500b0385979bdTim Murray 890b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 900b575de8ed0b628d84d256f5846500b0385979bdTim Murray 910b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 920b575de8ed0b628d84d256f5846500b0385979bdTim Murray * basic types traits 930b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 940b575de8ed0b628d84d256f5846500b0385979bdTim Murray 950b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( void ) 960b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( bool ) 970b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( char ) 980b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( unsigned char ) 990b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( short ) 1000b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( unsigned short ) 1010b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( int ) 1020b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( unsigned int ) 1030b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( long ) 1040b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( unsigned long ) 1050b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( long long ) 1060b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( unsigned long long ) 1070b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( float ) 1080b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_BASIC_TYPES_TRAITS( double ) 1090b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1100b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 1110b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1120b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1130b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 1140b575de8ed0b628d84d256f5846500b0385979bdTim Murray * compare and order types 1150b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 1160b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1170b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1180b575de8ed0b628d84d256f5846500b0385979bdTim Murrayint strictly_order_type(const TYPE& lhs, const TYPE& rhs) { 1190b575de8ed0b628d84d256f5846500b0385979bdTim Murray return (lhs < rhs) ? 1 : 0; 1200b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1210b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1220b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1230b575de8ed0b628d84d256f5846500b0385979bdTim Murrayint compare_type(const TYPE& lhs, const TYPE& rhs) { 1240b575de8ed0b628d84d256f5846500b0385979bdTim Murray return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs); 1250b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1260b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1270b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 1280b575de8ed0b628d84d256f5846500b0385979bdTim Murray * create, destroy, copy and move types... 1290b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 1300b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1310b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1320b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid construct_type(TYPE* p, size_t n) { 1330b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_ctor) { 1340b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1350b575de8ed0b628d84d256f5846500b0385979bdTim Murray new(p++) TYPE; 1360b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1370b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1380b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1390b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1400b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1410b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid destroy_type(TYPE* p, size_t n) { 1420b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_dtor) { 1430b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1440b575de8ed0b628d84d256f5846500b0385979bdTim Murray p->~TYPE(); 1450b575de8ed0b628d84d256f5846500b0385979bdTim Murray p++; 1460b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1470b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1480b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1490b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1500b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1510b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid copy_type(TYPE* d, const TYPE* s, size_t n) { 1520b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_copy) { 1530b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1540b575de8ed0b628d84d256f5846500b0385979bdTim Murray new(d) TYPE(*s); 1550b575de8ed0b628d84d256f5846500b0385979bdTim Murray d++, s++; 1560b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1570b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 1580b575de8ed0b628d84d256f5846500b0385979bdTim Murray memcpy(d,s,n*sizeof(TYPE)); 1590b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1600b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1610b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1620b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1630b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid splat_type(TYPE* where, const TYPE* what, size_t n) { 1640b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_copy) { 1650b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1660b575de8ed0b628d84d256f5846500b0385979bdTim Murray new(where) TYPE(*what); 1670b575de8ed0b628d84d256f5846500b0385979bdTim Murray where++; 1680b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1690b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 1700b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1710b575de8ed0b628d84d256f5846500b0385979bdTim Murray *where++ = *what; 1720b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1730b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1740b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1750b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1760b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 1770b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) { 1780b575de8ed0b628d84d256f5846500b0385979bdTim Murray if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 1790b575de8ed0b628d84d256f5846500b0385979bdTim Murray || traits<TYPE>::has_trivial_move) 1800b575de8ed0b628d84d256f5846500b0385979bdTim Murray { 1810b575de8ed0b628d84d256f5846500b0385979bdTim Murray memmove(d,s,n*sizeof(TYPE)); 1820b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 1830b575de8ed0b628d84d256f5846500b0385979bdTim Murray d += n; 1840b575de8ed0b628d84d256f5846500b0385979bdTim Murray s += n; 1850b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 1860b575de8ed0b628d84d256f5846500b0385979bdTim Murray --d, --s; 1870b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_copy) { 1880b575de8ed0b628d84d256f5846500b0385979bdTim Murray new(d) TYPE(*s); 1890b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 1900b575de8ed0b628d84d256f5846500b0385979bdTim Murray *d = *s; 1910b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1920b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_dtor) { 1930b575de8ed0b628d84d256f5846500b0385979bdTim Murray s->~TYPE(); 1940b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1950b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1960b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 1970b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 1980b575de8ed0b628d84d256f5846500b0385979bdTim Murray 1990b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate<typename TYPE> inline 2000b575de8ed0b628d84d256f5846500b0385979bdTim Murrayvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) { 2010b575de8ed0b628d84d256f5846500b0385979bdTim Murray if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 2020b575de8ed0b628d84d256f5846500b0385979bdTim Murray || traits<TYPE>::has_trivial_move) 2030b575de8ed0b628d84d256f5846500b0385979bdTim Murray { 2040b575de8ed0b628d84d256f5846500b0385979bdTim Murray memmove(d,s,n*sizeof(TYPE)); 2050b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 2060b575de8ed0b628d84d256f5846500b0385979bdTim Murray while (n--) { 2070b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_copy) { 2080b575de8ed0b628d84d256f5846500b0385979bdTim Murray new(d) TYPE(*s); 2090b575de8ed0b628d84d256f5846500b0385979bdTim Murray } else { 2100b575de8ed0b628d84d256f5846500b0385979bdTim Murray *d = *s; 2110b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2120b575de8ed0b628d84d256f5846500b0385979bdTim Murray if (!traits<TYPE>::has_trivial_dtor) { 2130b575de8ed0b628d84d256f5846500b0385979bdTim Murray s->~TYPE(); 2140b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2150b575de8ed0b628d84d256f5846500b0385979bdTim Murray d++, s++; 2160b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2170b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2180b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 2190b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2200b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 2210b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2220b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 2230b575de8ed0b628d84d256f5846500b0385979bdTim Murray * a key/value pair 2240b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 2250b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2260b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename KEY, typename VALUE> 2270b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct key_value_pair_t { 2280b575de8ed0b628d84d256f5846500b0385979bdTim Murray typedef KEY key_t; 2290b575de8ed0b628d84d256f5846500b0385979bdTim Murray typedef VALUE value_t; 2300b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2310b575de8ed0b628d84d256f5846500b0385979bdTim Murray KEY key; 2320b575de8ed0b628d84d256f5846500b0385979bdTim Murray VALUE value; 2330b575de8ed0b628d84d256f5846500b0385979bdTim Murray key_value_pair_t() { } 2340b575de8ed0b628d84d256f5846500b0385979bdTim Murray key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { } 2350b575de8ed0b628d84d256f5846500b0385979bdTim Murray key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v) { } 2360b575de8ed0b628d84d256f5846500b0385979bdTim Murray key_value_pair_t(const KEY& k) : key(k) { } 2370b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline bool operator < (const key_value_pair_t& o) const { 2380b575de8ed0b628d84d256f5846500b0385979bdTim Murray return strictly_order_type(key, o.key); 2390b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2400b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline const KEY& getKey() const { 2410b575de8ed0b628d84d256f5846500b0385979bdTim Murray return key; 2420b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2430b575de8ed0b628d84d256f5846500b0385979bdTim Murray inline const VALUE& getValue() const { 2440b575de8ed0b628d84d256f5846500b0385979bdTim Murray return value; 2450b575de8ed0b628d84d256f5846500b0385979bdTim Murray } 2460b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; 2470b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2480b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename K, typename V> 2490b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct trait_trivial_ctor< key_value_pair_t<K, V> > 2500b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; 2510b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename K, typename V> 2520b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct trait_trivial_dtor< key_value_pair_t<K, V> > 2530b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; 2540b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename K, typename V> 2550b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct trait_trivial_copy< key_value_pair_t<K, V> > 2560b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; 2570b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename K, typename V> 2580b575de8ed0b628d84d256f5846500b0385979bdTim Murraystruct trait_trivial_move< key_value_pair_t<K, V> > 2590b575de8ed0b628d84d256f5846500b0385979bdTim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_move }; }; 2600b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2610b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 2620b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2630b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* 2640b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Hash codes. 2650b575de8ed0b628d84d256f5846500b0385979bdTim Murray */ 2660b575de8ed0b628d84d256f5846500b0385979bdTim Murraytypedef uint32_t hash_t; 2670b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2680b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename TKey> 2690b575de8ed0b628d84d256f5846500b0385979bdTim Murrayhash_t hash_type(const TKey& key); 2700b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2710b575de8ed0b628d84d256f5846500b0385979bdTim Murray/* Built-in hash code specializations. 2720b575de8ed0b628d84d256f5846500b0385979bdTim Murray * Assumes pointers are 32bit. */ 2730b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_INT32_HASH(T) \ 2740b575de8ed0b628d84d256f5846500b0385979bdTim Murray template <> inline hash_t hash_type(const T& value) { return hash_t(value); } 2750b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_INT64_HASH(T) \ 2760b575de8ed0b628d84d256f5846500b0385979bdTim Murray template <> inline hash_t hash_type(const T& value) { \ 2770b575de8ed0b628d84d256f5846500b0385979bdTim Murray return hash_t((value >> 32) ^ value); } 2780b575de8ed0b628d84d256f5846500b0385979bdTim Murray#define ANDROID_REINTERPRET_HASH(T, R) \ 2790b575de8ed0b628d84d256f5846500b0385979bdTim Murray template <> inline hash_t hash_type(const T& value) { \ 2800b575de8ed0b628d84d256f5846500b0385979bdTim Murray return hash_type(*reinterpret_cast<const R*>(&value)); } 2810b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2820b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(bool) 2830b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(int8_t) 2840b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(uint8_t) 2850b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(int16_t) 2860b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(uint16_t) 2870b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(int32_t) 2880b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT32_HASH(uint32_t) 2890b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT64_HASH(int64_t) 2900b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_INT64_HASH(uint64_t) 2910b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_REINTERPRET_HASH(float, uint32_t) 2920b575de8ed0b628d84d256f5846500b0385979bdTim MurrayANDROID_REINTERPRET_HASH(double, uint64_t) 2930b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2940b575de8ed0b628d84d256f5846500b0385979bdTim Murraytemplate <typename T> inline hash_t hash_type(T* const & value) { 2950b575de8ed0b628d84d256f5846500b0385979bdTim Murray return hash_type(uintptr_t(value)); 2960b575de8ed0b628d84d256f5846500b0385979bdTim Murray} 2970b575de8ed0b628d84d256f5846500b0385979bdTim Murray 2980b575de8ed0b628d84d256f5846500b0385979bdTim Murray}; // namespace android 2990b575de8ed0b628d84d256f5846500b0385979bdTim Murray 3000b575de8ed0b628d84d256f5846500b0385979bdTim Murray// --------------------------------------------------------------------------- 3010b575de8ed0b628d84d256f5846500b0385979bdTim Murray 3020b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif // ANDROID_TYPE_HELPERS_H 303