1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
29857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * Copyright 2005 The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
49857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
59857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * you may not use this file except in compliance with the License.
69857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * You may obtain a copy of the License at
79857d99eecc389389da261a72461322d5cfb8eebMathias Agopian *
89857d99eecc389389da261a72461322d5cfb8eebMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
99857d99eecc389389da261a72461322d5cfb8eebMathias Agopian *
109857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * Unless required by applicable law or agreed to in writing, software
119857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
129857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * See the License for the specific language governing permissions and
149857d99eecc389389da261a72461322d5cfb8eebMathias Agopian * limitations under the License.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
179857d99eecc389389da261a72461322d5cfb8eebMathias Agopian#ifndef ANDROID_PIXELFLINGER_TYPE_HELPERS_H
189857d99eecc389389da261a72461322d5cfb8eebMathias Agopian#define ANDROID_PIXELFLINGER_TYPE_HELPERS_H
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <new>
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdint.h>
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <string.h>
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/types.h>
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectnamespace android {
289857d99eecc389389da261a72461322d5cfb8eebMathias Agopiannamespace tinyutils {
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Types traits
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_ctor  { enum { value = false }; };
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_dtor  { enum { value = false }; };
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_copy  { enum { value = false }; };
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_trivial_assign{ enum { value = false }; };
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer     { enum { value = false }; };
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T> struct trait_pointer<T*> { enum { value = true }; };
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_BASIC_TYPES_TRAITS( T )                                       \
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_ctor< T >  { enum { value = true }; };    \
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_dtor< T >  { enum { value = true }; };    \
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_copy< T >  { enum { value = true }; };    \
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_assign< T >{ enum { value = true }; };
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ANDROID_TYPE_TRAITS( T, ctor, dtor, copy, assign )                    \
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_ctor< T >  { enum { value = ctor }; };    \
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_dtor< T >  { enum { value = dtor }; };    \
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_copy< T >  { enum { value = copy }; };    \
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    template<> struct trait_trivial_assign< T >{ enum { value = assign }; };
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename TYPE>
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct traits {
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        is_pointer          = trait_pointer<TYPE>::value,
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_ctor    = is_pointer || trait_trivial_ctor<TYPE>::value,
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_dtor    = is_pointer || trait_trivial_dtor<TYPE>::value,
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_copy    = is_pointer || trait_trivial_copy<TYPE>::value,
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_assign  = is_pointer || trait_trivial_assign<TYPE>::value
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename T, typename U>
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct aggregate_traits {
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    enum {
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        is_pointer          = false,
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_ctor    = traits<T>::has_trivial_ctor && traits<U>::has_trivial_ctor,
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_dtor    = traits<T>::has_trivial_dtor && traits<U>::has_trivial_dtor,
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_copy    = traits<T>::has_trivial_copy && traits<U>::has_trivial_copy,
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        has_trivial_assign  = traits<T>::has_trivial_assign && traits<U>::has_trivial_assign
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    };
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * basic types traits
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( void );
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( bool );
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( char );
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned char );
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( short );
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned short );
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( int );
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned int );
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long );
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long );
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( long long );
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( unsigned long long );
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( float );
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectANDROID_BASIC_TYPES_TRAITS( double );
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * compare and order types
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint strictly_order_type(const TYPE& lhs, const TYPE& rhs) {
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return (lhs < rhs) ? 1 : 0;
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint compare_type(const TYPE& lhs, const TYPE& rhs) {
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    return strictly_order_type(rhs, lhs) - strictly_order_type(lhs, rhs);
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * create, destroy, copy and assign types...
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid construct_type(TYPE* p, size_t n) {
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_ctor) {
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(p++) TYPE;
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 destroy_type(TYPE* p, size_t n) {
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_dtor) {
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            p->~TYPE();
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            p++;
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid copy_type(TYPE* d, const TYPE* s, size_t n) {
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(d) TYPE(*s);
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            d++, s++;
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memcpy(d,s,n*sizeof(TYPE));
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid assign_type(TYPE* d, const TYPE* s, size_t n) {
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_assign) {
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            *d++ = *s++;
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memcpy(d,s,n*sizeof(TYPE));
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid splat_type(TYPE* where, const TYPE* what, size_t n) {
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy) {
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            new(where) TYPE(*what);
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            where++;
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project         while (n--) {
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project             *where++ = *what;
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_forward_type(TYPE* d, const TYPE* s, size_t n = 1) {
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) {
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        d += n;
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        s += n;
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            --d, --s;
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                new(d) TYPE(*s);
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                *d = *s;
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                s->~TYPE();
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memmove(d,s,n*sizeof(TYPE));
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<typename TYPE> inline
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid move_backward_type(TYPE* d, const TYPE* s, size_t n = 1) {
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    if (!traits<TYPE>::has_trivial_copy || !traits<TYPE>::has_trivial_dtor) {
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        while (n--) {
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_copy) {
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                new(d) TYPE(*s);
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            } else {
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                *d = *s;
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            if (!traits<TYPE>::has_trivial_dtor) {
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project                s->~TYPE();
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            }
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project            d++, s++;
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        }
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    } else {
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        memmove(d,s,n*sizeof(TYPE));
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * a key/value pair
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename KEY, typename VALUE>
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct key_value_pair_t {
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    KEY     key;
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    VALUE   value;
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t() { }
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const key_value_pair_t& o) : key(o.key), value(o.value) { }
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const KEY& k, const VALUE& v) : key(k), value(v)  { }
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    key_value_pair_t(const KEY& k) : key(k) { }
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    inline bool operator < (const key_value_pair_t& o) const {
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project        return strictly_order_type(key, o.key);
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project    }
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project};
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_ctor< key_value_pair_t<K, V> >
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_ctor }; };
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_dtor< key_value_pair_t<K, V> >
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_dtor }; };
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_copy< key_value_pair_t<K, V> >
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_copy }; };
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate<>
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecttemplate <typename K, typename V>
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct trait_trivial_assign< key_value_pair_t<K, V> >
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{ enum { value = aggregate_traits<K,V>::has_trivial_assign};};
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
2519857d99eecc389389da261a72461322d5cfb8eebMathias Agopian} // namespace tinyutils
2529857d99eecc389389da261a72461322d5cfb8eebMathias Agopian} // namespace android
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project// ---------------------------------------------------------------------------
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
2569857d99eecc389389da261a72461322d5cfb8eebMathias Agopian#endif // ANDROID_PIXELFLINGER_TYPE_HELPERS_H
257