]> git.saurik.com Git - apple/javascriptcore.git/blame - wtf/VectorTraits.h
JavaScriptCore-461.tar.gz
[apple/javascriptcore.git] / wtf / VectorTraits.h
CommitLineData
b37bf2e1
A
1// -*- mode: c++; c-basic-offset: 4 -*-
2/*
3 * This file is part of the KDE libraries
4 * Copyright (C) 2006 Apple Computer, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23#ifndef WTF_VectorTraits_h
24#define WTF_VectorTraits_h
25
26#include "RefPtr.h"
27#include <utility>
28
29using std::pair;
30
31namespace WTF {
32
33 template <typename T> struct IsPod { static const bool value = false; };
34 template <> struct IsPod<bool> { static const bool value = true; };
35 template <> struct IsPod<char> { static const bool value = true; };
36 template <> struct IsPod<signed char> { static const bool value = true; };
37 template <> struct IsPod<unsigned char> { static const bool value = true; };
38 template <> struct IsPod<short> { static const bool value = true; };
39 template <> struct IsPod<unsigned short> { static const bool value = true; };
40 template <> struct IsPod<int> { static const bool value = true; };
41 template <> struct IsPod<unsigned int> { static const bool value = true; };
42 template <> struct IsPod<long> { static const bool value = true; };
43 template <> struct IsPod<unsigned long> { static const bool value = true; };
44 template <> struct IsPod<long long> { static const bool value = true; };
45 template <> struct IsPod<unsigned long long> { static const bool value = true; };
46 template <> struct IsPod<float> { static const bool value = true; };
47 template <> struct IsPod<double> { static const bool value = true; };
48 template <> struct IsPod<long double> { static const bool value = true; };
49 template <typename P> struct IsPod<P *> { static const bool value = true; };
50
51 template<bool isPod, typename T>
52 class VectorTraitsBase;
53
54 template<typename T>
55 struct VectorTraitsBase<false, T>
56 {
57 static const bool needsDestruction = true;
58 static const bool needsInitialization = true;
59 static const bool canInitializeWithMemset = false;
60 static const bool canMoveWithMemcpy = false;
61 static const bool canCopyWithMemcpy = false;
62 static const bool canFillWithMemset = false;
63 static const bool canCompareWithMemcmp = false;
64 };
65
66 template<typename T>
67 struct VectorTraitsBase<true, T>
68 {
69 static const bool needsDestruction = false;
70 static const bool needsInitialization = false;
71 static const bool canInitializeWithMemset = false;
72 static const bool canMoveWithMemcpy = true;
73 static const bool canCopyWithMemcpy = true;
74 static const bool canFillWithMemset = sizeof(T) == sizeof(char);
75 static const bool canCompareWithMemcmp = true;
76 };
77
78 template<typename T>
79 struct VectorTraits : VectorTraitsBase<IsPod<T>::value, T> { };
80
81 struct SimpleClassVectorTraits
82 {
83 static const bool needsDestruction = true;
84 static const bool needsInitialization = true;
85 static const bool canInitializeWithMemset = true;
86 static const bool canMoveWithMemcpy = true;
87 static const bool canCopyWithMemcpy = false;
88 static const bool canFillWithMemset = false;
89 static const bool canCompareWithMemcmp = true;
90 };
91
92 // we know RefPtr is simple enough that initializing to 0 and moving with memcpy
93 // (and then not destructing the original) will totally work
94 template<typename P>
95 struct VectorTraits<RefPtr<P> > : SimpleClassVectorTraits { };
96
97 template<typename First, typename Second>
98 struct VectorTraits<pair<First, Second> >
99 {
100 typedef VectorTraits<First> FirstTraits;
101 typedef VectorTraits<Second> SecondTraits;
102
103 static const bool needsDestruction = FirstTraits::needsDestruction || SecondTraits::needsDestruction;
104 static const bool needsInitialization = FirstTraits::needsInitialization || SecondTraits::needsInitialization;
105 static const bool canInitializeWithMemset = FirstTraits::canInitializeWithMemset && SecondTraits::canInitializeWithMemset;
106 static const bool canMoveWithMemcpy = FirstTraits::canMoveWithMemcpy && SecondTraits::canMoveWithMemcpy;
107 static const bool canCopyWithMemcpy = FirstTraits::canCopyWithMemcpy && SecondTraits::canCopyWithMemcpy;
108 static const bool canFillWithMemset = false;
109 static const bool canCompareWithMemcmp = FirstTraits::canCompareWithMemcmp && SecondTraits::canCompareWithMemcmp;
110 };
111
112} // namespace WTF
113
114using WTF::VectorTraits;
115using WTF::SimpleClassVectorTraits;
116
117#endif // WTF_VectorTraits_h