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