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