1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *  TypeHelpers.h
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *  Copyright 2005 The Android Open Source Project
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef ANDROID_TYPE_HELPERS_H
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_TYPE_HELPERS_H
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <new>
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h>
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android {
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Types traits
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_ctor  { enum { value = false }; };
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_dtor  { enum { value = false }; };
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_copy  { enum { value = false }; };
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_assign{ enum { value = false }; };
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer     { enum { value = false }; };
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer<T*> { enum { value = true }; };
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_BASIC_TYPES_TRAITS( T )                                       \
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_ctor< T >  { enum { value = true }; };    \
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_dtor< T >  { enum { value = true }; };    \
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_copy< T >  { enum { value = true }; };    \
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_assign< T >{ enum { value = true }; };
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_TYPE_TRAITS( T, ctor, dtor, copy, assign )                    \
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_ctor< T >  { enum { value = ctor }; };    \
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_dtor< T >  { enum { value = dtor }; };    \
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_copy< T >  { enum { value = copy }; };    \
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_assign< T >{ enum { value = assign }; };
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename TYPE>
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct traits {
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        is_pointer          = trait_pointer<TYPE>::value,
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_ctor    = is_pointer || trait_trivial_ctor<TYPE>::value,
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_dtor    = is_pointer || trait_trivial_dtor<TYPE>::value,
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_copy    = is_pointer || trait_trivial_copy<TYPE>::value,
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_assign  = is_pointer || trait_trivial_assign<TYPE>::value
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T, typename U>
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct aggregate_traits {
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        is_pointer          = false,
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_ctor    = traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor,
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_dtor    = traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor,
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_copy    = traits<T>::has_trivial_copy && traits<U>::has_trivial_copy,
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_assign  = traits<T>::has_trivial_assign && traits<U>::has_trivial_assign
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * basic types traits
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( void );
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( bool );
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( char );
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned char );
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( short );
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned short );
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( int );
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned int );
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long );
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long );
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long long );
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long long );
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( float );
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( double );
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * compare and order types
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) {
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return (lhs < rhs) ? 1 : 0;
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) {
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs);
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * create, destroy, copy and assign types...
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) {
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_ctor) {
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(p++) TYPE;
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid destroy_type(TYPE* p, size_t n) {
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_dtor) {
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            p->~TYPE();
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            p++;
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) {
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(d) TYPE(*s);
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            d++, s++;
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memcpy(d,s,n*sizeof(TYPE));
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid assign_type(TYPE* d, const TYPE* s, size_t n) {
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_assign) {
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            *d++ = *s++;
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memcpy(d,s,n*sizeof(TYPE));
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) {
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(where) TYPE(*what);
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            where++;
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         while (n--) {
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project             *where++ = *what;
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) {
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) {
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        d += n;
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        s += n;
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            --d, --s;
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                new(d) TYPE(*s);
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                *d = *s;
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                s->~TYPE();
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memmove(d,s,n*sizeof(TYPE));
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) {
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) {
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                new(d) TYPE(*s);
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                *d = *s;
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                s->~TYPE();
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            d++, s++;
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memmove(d,s,n*sizeof(TYPE));
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * a key/value pair
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename KEY, typename VALUE>
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct key_value_pair_t {
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    KEY     key;
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    VALUE   value;
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t() { }
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { }
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v)  { }
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const KEY& k) : key(k) { }
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    inline bool operator < (const key_value_pair_t& o) const {
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return strictly_order_type(key, o.key);
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> >
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; };
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> >
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; };
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> >
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; };
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_assign< key_value_pair_t<K, V> >
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_assign};};
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}; // namespace android
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif // ANDROID_TYPE_HELPERS_H
246