189daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 289daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Copyright (C) 2013 The Android Open Source Project 389daad6bae798779e57f252e9da4fe4e62337124Tim Murray * 489daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Licensed under the Apache License, Version 2.0 (the "License"); 589daad6bae798779e57f252e9da4fe4e62337124Tim Murray * you may not use this file except in compliance with the License. 689daad6bae798779e57f252e9da4fe4e62337124Tim Murray * You may obtain a copy of the License at 789daad6bae798779e57f252e9da4fe4e62337124Tim Murray * 889daad6bae798779e57f252e9da4fe4e62337124Tim Murray * http://www.apache.org/licenses/LICENSE-2.0 989daad6bae798779e57f252e9da4fe4e62337124Tim Murray * 1089daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Unless required by applicable law or agreed to in writing, software 1189daad6bae798779e57f252e9da4fe4e62337124Tim Murray * distributed under the License is distributed on an "AS IS" BASIS, 1289daad6bae798779e57f252e9da4fe4e62337124Tim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389daad6bae798779e57f252e9da4fe4e62337124Tim Murray * See the License for the specific language governing permissions and 1489daad6bae798779e57f252e9da4fe4e62337124Tim Murray * limitations under the License. 1589daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 1689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 1789daad6bae798779e57f252e9da4fe4e62337124Tim Murray#ifndef RS_TYPE_HELPERS_H 1889daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_TYPE_HELPERS_H 1989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 2089daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include <new> 2189daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include <stdint.h> 2289daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include <string.h> 2389daad6bae798779e57f252e9da4fe4e62337124Tim Murray#include <sys/types.h> 2489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 2589daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 2689daad6bae798779e57f252e9da4fe4e62337124Tim Murraynamespace android { 2789daad6bae798779e57f252e9da4fe4e62337124Tim Murraynamespace RSC { 2889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 2989daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 3089daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Types traits 3189daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 3289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 3389daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_trivial_ctor { enum { value = false }; }; 3489daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_trivial_dtor { enum { value = false }; }; 3589daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_trivial_copy { enum { value = false }; }; 3689daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_trivial_move { enum { value = false }; }; 3789daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_pointer { enum { value = false }; }; 3889daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> struct trait_pointer<T*> { enum { value = true }; }; 3989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 4089daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename TYPE> 4189daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct traits { 4289daad6bae798779e57f252e9da4fe4e62337124Tim Murray enum { 4389daad6bae798779e57f252e9da4fe4e62337124Tim Murray // whether this type is a pointer 4489daad6bae798779e57f252e9da4fe4e62337124Tim Murray is_pointer = trait_pointer<TYPE>::value, 4589daad6bae798779e57f252e9da4fe4e62337124Tim Murray // whether this type's constructor is a no-op 4689daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_ctor = is_pointer || trait_trivial_ctor<TYPE>::value, 4789daad6bae798779e57f252e9da4fe4e62337124Tim Murray // whether this type's destructor is a no-op 4889daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_dtor = is_pointer || trait_trivial_dtor<TYPE>::value, 4989daad6bae798779e57f252e9da4fe4e62337124Tim Murray // whether this type type can be copy-constructed with memcpy 5089daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_copy = is_pointer || trait_trivial_copy<TYPE>::value, 5189daad6bae798779e57f252e9da4fe4e62337124Tim Murray // whether this type can be moved with memmove 5289daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_move = is_pointer || trait_trivial_move<TYPE>::value 5389daad6bae798779e57f252e9da4fe4e62337124Tim Murray }; 5489daad6bae798779e57f252e9da4fe4e62337124Tim Murray}; 5589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 5689daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T, typename U> 5789daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct aggregate_traits { 5889daad6bae798779e57f252e9da4fe4e62337124Tim Murray enum { 5989daad6bae798779e57f252e9da4fe4e62337124Tim Murray is_pointer = false, 6089daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_ctor = 6189daad6bae798779e57f252e9da4fe4e62337124Tim Murray traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor, 6289daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_dtor = 6389daad6bae798779e57f252e9da4fe4e62337124Tim Murray traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor, 6489daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_copy = 6589daad6bae798779e57f252e9da4fe4e62337124Tim Murray traits<T>::has_trivial_copy && traits<U>::has_trivial_copy, 6689daad6bae798779e57f252e9da4fe4e62337124Tim Murray has_trivial_move = 6789daad6bae798779e57f252e9da4fe4e62337124Tim Murray traits<T>::has_trivial_move && traits<U>::has_trivial_move 6889daad6bae798779e57f252e9da4fe4e62337124Tim Murray }; 6989daad6bae798779e57f252e9da4fe4e62337124Tim Murray}; 7089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 7189daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_TRIVIAL_CTOR_TRAIT( T ) \ 7289daad6bae798779e57f252e9da4fe4e62337124Tim Murray template<> struct trait_trivial_ctor< T > { enum { value = true }; }; 7389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 7489daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_TRIVIAL_DTOR_TRAIT( T ) \ 7589daad6bae798779e57f252e9da4fe4e62337124Tim Murray template<> struct trait_trivial_dtor< T > { enum { value = true }; }; 7689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 7789daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_TRIVIAL_COPY_TRAIT( T ) \ 7889daad6bae798779e57f252e9da4fe4e62337124Tim Murray template<> struct trait_trivial_copy< T > { enum { value = true }; }; 7989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 8089daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_TRIVIAL_MOVE_TRAIT( T ) \ 8189daad6bae798779e57f252e9da4fe4e62337124Tim Murray template<> struct trait_trivial_move< T > { enum { value = true }; }; 8289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 8389daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_BASIC_TYPES_TRAITS( T ) \ 8489daad6bae798779e57f252e9da4fe4e62337124Tim Murray RS_TRIVIAL_CTOR_TRAIT( T ) \ 8589daad6bae798779e57f252e9da4fe4e62337124Tim Murray RS_TRIVIAL_DTOR_TRAIT( T ) \ 8689daad6bae798779e57f252e9da4fe4e62337124Tim Murray RS_TRIVIAL_COPY_TRAIT( T ) \ 8789daad6bae798779e57f252e9da4fe4e62337124Tim Murray RS_TRIVIAL_MOVE_TRAIT( T ) 8889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 8989daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 9089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 9189daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 9289daad6bae798779e57f252e9da4fe4e62337124Tim Murray * basic types traits 9389daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 9489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 9589daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( void ) 9689daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( bool ) 9789daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( char ) 9889daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( unsigned char ) 9989daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( short ) 10089daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( unsigned short ) 10189daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( int ) 10289daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( unsigned int ) 10389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( long ) 10489daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( unsigned long ) 10589daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( long long ) 10689daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( unsigned long long ) 10789daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( float ) 10889daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_BASIC_TYPES_TRAITS( double ) 10989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 11089daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 11189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 11289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 11389daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 11489daad6bae798779e57f252e9da4fe4e62337124Tim Murray * compare and order types 11589daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 11689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 11789daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 11889daad6bae798779e57f252e9da4fe4e62337124Tim Murrayint strictly_order_type(const TYPE& lhs, const TYPE& rhs) { 11989daad6bae798779e57f252e9da4fe4e62337124Tim Murray return (lhs < rhs) ? 1 : 0; 12089daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 12189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 12289daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 12389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayint compare_type(const TYPE& lhs, const TYPE& rhs) { 12489daad6bae798779e57f252e9da4fe4e62337124Tim Murray return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs); 12589daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 12689daad6bae798779e57f252e9da4fe4e62337124Tim Murray 12789daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 12889daad6bae798779e57f252e9da4fe4e62337124Tim Murray * create, destroy, copy and move types... 12989daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 13089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 13189daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 13289daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid construct_type(TYPE* p, size_t n) { 13389daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_ctor) { 13489daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 13589daad6bae798779e57f252e9da4fe4e62337124Tim Murray new(p++) TYPE; 13689daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 13789daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 13889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 13989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 14089daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 14189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid destroy_type(TYPE* p, size_t n) { 14289daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_dtor) { 14389daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 14489daad6bae798779e57f252e9da4fe4e62337124Tim Murray p->~TYPE(); 14589daad6bae798779e57f252e9da4fe4e62337124Tim Murray p++; 14689daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 14789daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 14889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 14989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 15089daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 15189daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid copy_type(TYPE* d, const TYPE* s, size_t n) { 15289daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_copy) { 15389daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 15489daad6bae798779e57f252e9da4fe4e62337124Tim Murray new(d) TYPE(*s); 15589daad6bae798779e57f252e9da4fe4e62337124Tim Murray d++, s++; 15689daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 15789daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 15889daad6bae798779e57f252e9da4fe4e62337124Tim Murray memcpy(d,s,n*sizeof(TYPE)); 15989daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 16089daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 16189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 16289daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 16389daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid splat_type(TYPE* where, const TYPE* what, size_t n) { 16489daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_copy) { 16589daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 16689daad6bae798779e57f252e9da4fe4e62337124Tim Murray new(where) TYPE(*what); 16789daad6bae798779e57f252e9da4fe4e62337124Tim Murray where++; 16889daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 16989daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 17089daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 17189daad6bae798779e57f252e9da4fe4e62337124Tim Murray *where++ = *what; 17289daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 17389daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 17489daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 17589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 17689daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 17789daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) { 17889daad6bae798779e57f252e9da4fe4e62337124Tim Murray if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 17989daad6bae798779e57f252e9da4fe4e62337124Tim Murray || traits<TYPE>::has_trivial_move) 18089daad6bae798779e57f252e9da4fe4e62337124Tim Murray { 18189daad6bae798779e57f252e9da4fe4e62337124Tim Murray memmove(d,s,n*sizeof(TYPE)); 18289daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 18389daad6bae798779e57f252e9da4fe4e62337124Tim Murray d += n; 18489daad6bae798779e57f252e9da4fe4e62337124Tim Murray s += n; 18589daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 18689daad6bae798779e57f252e9da4fe4e62337124Tim Murray --d, --s; 18789daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_copy) { 18889daad6bae798779e57f252e9da4fe4e62337124Tim Murray new(d) TYPE(*s); 18989daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 19089daad6bae798779e57f252e9da4fe4e62337124Tim Murray *d = *s; 19189daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 19289daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_dtor) { 19389daad6bae798779e57f252e9da4fe4e62337124Tim Murray s->~TYPE(); 19489daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 19589daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 19689daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 19789daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 19889daad6bae798779e57f252e9da4fe4e62337124Tim Murray 19989daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate<typename TYPE> inline 20089daad6bae798779e57f252e9da4fe4e62337124Tim Murrayvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) { 20189daad6bae798779e57f252e9da4fe4e62337124Tim Murray if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy) 20289daad6bae798779e57f252e9da4fe4e62337124Tim Murray || traits<TYPE>::has_trivial_move) 20389daad6bae798779e57f252e9da4fe4e62337124Tim Murray { 20489daad6bae798779e57f252e9da4fe4e62337124Tim Murray memmove(d,s,n*sizeof(TYPE)); 20589daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 20689daad6bae798779e57f252e9da4fe4e62337124Tim Murray while (n--) { 20789daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_copy) { 20889daad6bae798779e57f252e9da4fe4e62337124Tim Murray new(d) TYPE(*s); 20989daad6bae798779e57f252e9da4fe4e62337124Tim Murray } else { 21089daad6bae798779e57f252e9da4fe4e62337124Tim Murray *d = *s; 21189daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 21289daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (!traits<TYPE>::has_trivial_dtor) { 21389daad6bae798779e57f252e9da4fe4e62337124Tim Murray s->~TYPE(); 21489daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 21589daad6bae798779e57f252e9da4fe4e62337124Tim Murray d++, s++; 21689daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 21789daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 21889daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 21989daad6bae798779e57f252e9da4fe4e62337124Tim Murray 22089daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 22189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 22289daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 22389daad6bae798779e57f252e9da4fe4e62337124Tim Murray * a key/value pair 22489daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 22589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 22689daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename KEY, typename VALUE> 22789daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct key_value_pair_t { 22889daad6bae798779e57f252e9da4fe4e62337124Tim Murray typedef KEY key_t; 22989daad6bae798779e57f252e9da4fe4e62337124Tim Murray typedef VALUE value_t; 23089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 23189daad6bae798779e57f252e9da4fe4e62337124Tim Murray KEY key; 23289daad6bae798779e57f252e9da4fe4e62337124Tim Murray VALUE value; 23389daad6bae798779e57f252e9da4fe4e62337124Tim Murray key_value_pair_t() { } 23489daad6bae798779e57f252e9da4fe4e62337124Tim Murray key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { } 23589daad6bae798779e57f252e9da4fe4e62337124Tim Murray key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v) { } 23689daad6bae798779e57f252e9da4fe4e62337124Tim Murray key_value_pair_t(const KEY& k) : key(k) { } 23789daad6bae798779e57f252e9da4fe4e62337124Tim Murray inline bool operator < (const key_value_pair_t& o) const { 23889daad6bae798779e57f252e9da4fe4e62337124Tim Murray return strictly_order_type(key, o.key); 23989daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 24089daad6bae798779e57f252e9da4fe4e62337124Tim Murray inline const KEY& getKey() const { 24189daad6bae798779e57f252e9da4fe4e62337124Tim Murray return key; 24289daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 24389daad6bae798779e57f252e9da4fe4e62337124Tim Murray inline const VALUE& getValue() const { 24489daad6bae798779e57f252e9da4fe4e62337124Tim Murray return value; 24589daad6bae798779e57f252e9da4fe4e62337124Tim Murray } 24689daad6bae798779e57f252e9da4fe4e62337124Tim Murray}; 24789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 24889daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename K, typename V> 24989daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct trait_trivial_ctor< key_value_pair_t<K, V> > 25089daad6bae798779e57f252e9da4fe4e62337124Tim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; }; 25189daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename K, typename V> 25289daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct trait_trivial_dtor< key_value_pair_t<K, V> > 25389daad6bae798779e57f252e9da4fe4e62337124Tim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; }; 25489daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename K, typename V> 25589daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct trait_trivial_copy< key_value_pair_t<K, V> > 25689daad6bae798779e57f252e9da4fe4e62337124Tim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; }; 25789daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename K, typename V> 25889daad6bae798779e57f252e9da4fe4e62337124Tim Murraystruct trait_trivial_move< key_value_pair_t<K, V> > 25989daad6bae798779e57f252e9da4fe4e62337124Tim Murray{ enum { value = aggregate_traits<K,V>::has_trivial_move }; }; 26089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 26189daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 26289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 26389daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* 26489daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Hash codes. 26589daad6bae798779e57f252e9da4fe4e62337124Tim Murray */ 26689daad6bae798779e57f252e9da4fe4e62337124Tim Murraytypedef uint32_t hash_t; 26789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 26889daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename TKey> 26989daad6bae798779e57f252e9da4fe4e62337124Tim Murrayhash_t hash_type(const TKey& key); 27089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 27189daad6bae798779e57f252e9da4fe4e62337124Tim Murray/* Built-in hash code specializations. 27289daad6bae798779e57f252e9da4fe4e62337124Tim Murray * Assumes pointers are 32bit. */ 27389daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_INT32_HASH(T) \ 27489daad6bae798779e57f252e9da4fe4e62337124Tim Murray template <> inline hash_t hash_type(const T& value) { return hash_t(value); } 27589daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_INT64_HASH(T) \ 27689daad6bae798779e57f252e9da4fe4e62337124Tim Murray template <> inline hash_t hash_type(const T& value) { \ 27789daad6bae798779e57f252e9da4fe4e62337124Tim Murray return hash_t((value >> 32) ^ value); } 27889daad6bae798779e57f252e9da4fe4e62337124Tim Murray#define RS_REINTERPRET_HASH(T, R) \ 27989daad6bae798779e57f252e9da4fe4e62337124Tim Murray template <> inline hash_t hash_type(const T& value) { \ 28089daad6bae798779e57f252e9da4fe4e62337124Tim Murray return hash_type(*reinterpret_cast<const R*>(&value)); } 28189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 28289daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(bool) 28389daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(int8_t) 28489daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(uint8_t) 28589daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(int16_t) 28689daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(uint16_t) 28789daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(int32_t) 28889daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT32_HASH(uint32_t) 28989daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT64_HASH(int64_t) 29089daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_INT64_HASH(uint64_t) 29189daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_REINTERPRET_HASH(float, uint32_t) 29289daad6bae798779e57f252e9da4fe4e62337124Tim MurrayRS_REINTERPRET_HASH(double, uint64_t) 29389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 29489daad6bae798779e57f252e9da4fe4e62337124Tim Murraytemplate <typename T> inline hash_t hash_type(T* const & value) { 29589daad6bae798779e57f252e9da4fe4e62337124Tim Murray return hash_type(uintptr_t(value)); 29689daad6bae798779e57f252e9da4fe4e62337124Tim Murray} 29789daad6bae798779e57f252e9da4fe4e62337124Tim Murray 29889daad6bae798779e57f252e9da4fe4e62337124Tim Murray}; // namespace RSC 29989daad6bae798779e57f252e9da4fe4e62337124Tim Murray}; // namespace android 30089daad6bae798779e57f252e9da4fe4e62337124Tim Murray// --------------------------------------------------------------------------- 30189daad6bae798779e57f252e9da4fe4e62337124Tim Murray 30289daad6bae798779e57f252e9da4fe4e62337124Tim Murray#endif // RS_TYPE_HELPERS_H 303