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