1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#ifndef ANDROID_TYPE_HELPERS_H
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define ANDROID_TYPE_HELPERS_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <new>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <string.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Types traits
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
325f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
335f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_ctor { enum { value = false }; };
345f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_dtor { enum { value = false }; };
355f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_copy { enum { value = false }; };
365f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_trivial_move { enum { value = false }; };
375f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_pointer      { enum { value = false }; };
385f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopiantemplate <typename T> struct trait_pointer<T*>  { enum { value = true }; };
395f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename TYPE>
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct traits {
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
435f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        // whether this type is a pointer
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        is_pointer          = trait_pointer<TYPE>::value,
455f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        // whether this type's constructor is a no-op
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        has_trivial_ctor    = is_pointer || trait_trivial_ctor<TYPE>::value,
475f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        // whether this type's destructor is a no-op
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        has_trivial_dtor    = is_pointer || trait_trivial_dtor<TYPE>::value,
495f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        // whether this type type can be copy-constructed with memcpy
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        has_trivial_copy    = is_pointer || trait_trivial_copy<TYPE>::value,
515f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        // whether this type can be moved with memmove
525f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        has_trivial_move    = is_pointer || trait_trivial_move<TYPE>::value
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename T, typename U>
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct aggregate_traits {
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    enum {
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        is_pointer          = false,
605f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        has_trivial_ctor    =
615f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor,
625f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        has_trivial_dtor    =
635f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor,
645f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        has_trivial_copy    =
655f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            traits<T>::has_trivial_copy && traits<U>::has_trivial_copy,
665f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        has_trivial_move    =
675f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            traits<T>::has_trivial_move && traits<U>::has_trivial_move
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_CTOR_TRAIT( T ) \
72e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    template<> struct trait_trivial_ctor< T >   { enum { value = true }; };
73e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown
74e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_DTOR_TRAIT( T ) \
75e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    template<> struct trait_trivial_dtor< T >   { enum { value = true }; };
76e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown
77e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_COPY_TRAIT( T ) \
78e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    template<> struct trait_trivial_copy< T >   { enum { value = true }; };
79e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown
80e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_TRIVIAL_MOVE_TRAIT( T ) \
815f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    template<> struct trait_trivial_move< T >   { enum { value = true }; };
825f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
83e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown#define ANDROID_BASIC_TYPES_TRAITS( T ) \
84e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    ANDROID_TRIVIAL_CTOR_TRAIT( T ) \
85e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    ANDROID_TRIVIAL_DTOR_TRAIT( T ) \
86e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    ANDROID_TRIVIAL_COPY_TRAIT( T ) \
87e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown    ANDROID_TRIVIAL_MOVE_TRAIT( T )
88e6d77c593d1a25b45c23bf9292ec7ee09fc14b6eJeff Brown
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * basic types traits
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
945f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
955f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( void )
965f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( bool )
975f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( char )
985f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned char )
995f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( short )
1005f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned short )
1015f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( int )
1025f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned int )
1035f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long )
1045f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long )
1055f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( long long )
1065f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( unsigned long long )
1075f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( float )
1085f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias AgopianANDROID_BASIC_TYPES_TRAITS( double )
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1125f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * compare and order types
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return (lhs < rhs) ? 1 : 0;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) {
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs);
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
1285f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian * create, destroy, copy and move types...
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
1305f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!traits<TYPE>::has_trivial_ctor) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            new(p++) TYPE;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid destroy_type(TYPE* p, size_t n) {
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!traits<TYPE>::has_trivial_dtor) {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            p->~TYPE();
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            p++;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) {
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            new(d) TYPE(*s);
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d++, s++;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        memcpy(d,s,n*sizeof(TYPE));
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) {
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            new(where) TYPE(*what);
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            where++;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
1705f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        while (n--) {
1715f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            *where++ = *what;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) {
1785f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy)
1795f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            || traits<TYPE>::has_trivial_move)
1805f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    {
1815f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        memmove(d,s,n*sizeof(TYPE));
1825f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    } else {
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        d += n;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        s += n;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            --d, --s;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                new(d) TYPE(*s);
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
1905f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian                *d = *s;
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                s->~TYPE();
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate<typename TYPE> inline
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) {
2015f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    if ((traits<TYPE>::has_trivial_dtor && traits<TYPE>::has_trivial_copy)
2025f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian            || traits<TYPE>::has_trivial_move)
2035f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    {
2045f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian        memmove(d,s,n*sizeof(TYPE));
2055f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian    } else {
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        while (n--) {
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                new(d) TYPE(*s);
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            } else {
2105f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian                *d = *s;
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                s->~TYPE();
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            d++, s++;
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
2195f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * a key/value pair
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename KEY, typename VALUE>
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct key_value_pair_t {
22866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    typedef KEY key_t;
22966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    typedef VALUE value_t;
23066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    KEY     key;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    VALUE   value;
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    key_value_pair_t() { }
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { }
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v)  { }
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    key_value_pair_t(const KEY& k) : key(k) { }
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    inline bool operator < (const key_value_pair_t& o) const {
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return strictly_order_type(key, o.key);
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
24066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    inline const KEY& getKey() const {
24166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown        return key;
24266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    }
24366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    inline const VALUE& getValue() const {
24466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown        return value;
24566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    }
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V>
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> >
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; };
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V>
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> >
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; };
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V>
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> >
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; };
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projecttemplate <typename K, typename V>
2585f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopianstruct trait_trivial_move< key_value_pair_t<K, V> >
2595f28411a856e47f86e3b0c7c031a6c0e0fa1dba0Mathias Agopian{ enum { value = aggregate_traits<K,V>::has_trivial_move }; };
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown/*
26466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown * Hash codes.
26566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown */
26666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntypedef uint32_t hash_t;
26766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
26866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntemplate <typename TKey>
26966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brownhash_t hash_type(const TKey& key);
27066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
27166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown/* Built-in hash code specializations.
27266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown * Assumes pointers are 32bit. */
27366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_INT32_HASH(T) \
27466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown        template <> inline hash_t hash_type(const T& value) { return hash_t(value); }
27566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_INT64_HASH(T) \
27666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown        template <> inline hash_t hash_type(const T& value) { \
27766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown                return hash_t((value >> 32) ^ value); }
27866fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown#define ANDROID_REINTERPRET_HASH(T, R) \
27966fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown        template <> inline hash_t hash_type(const T& value) { \
28066fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown                return hash_type(*reinterpret_cast<const R*>(&value)); }
28166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
28266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_INT32_HASH(bool)
28348585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int8_t)
28448585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint8_t)
28548585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int16_t)
28648585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint16_t)
28748585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(int32_t)
28848585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT32_HASH(uint32_t)
28948585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT64_HASH(int64_t)
29048585f35c7f0ef0dbe7eb67bed90b79e5fd426f6Jeff BrownANDROID_INT64_HASH(uint64_t)
29166fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_REINTERPRET_HASH(float, uint32_t)
29266fbde305047b7a606d083a9ec8994fa693cc7d7Jeff BrownANDROID_REINTERPRET_HASH(double, uint64_t)
29366fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
29466fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Browntemplate <typename T> inline hash_t hash_type(const T*& value) {
29566fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown    return hash_type(uintptr_t(value));
29666fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown}
29766fbde305047b7a606d083a9ec8994fa693cc7d7Jeff Brown
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ANDROID_TYPE_HELPERS_H
303