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