From 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c Mon Sep 17 00:00:00 2001 From: Lorry Tar Creator Date: Tue, 27 Jun 2017 06:07:23 +0000 Subject: webkitgtk-2.16.5 --- Source/WTF/wtf/CrossThreadCopier.h | 139 +++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 Source/WTF/wtf/CrossThreadCopier.h (limited to 'Source/WTF/wtf/CrossThreadCopier.h') diff --git a/Source/WTF/wtf/CrossThreadCopier.h b/Source/WTF/wtf/CrossThreadCopier.h new file mode 100644 index 000000000..f0c86e550 --- /dev/null +++ b/Source/WTF/wtf/CrossThreadCopier.h @@ -0,0 +1,139 @@ +/* + * Copyright (C) 2009, 2010 Google Inc. All rights reserved. + * Copyright (C) 2014, 2015, 2016 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace WTF { + +struct CrossThreadCopierBaseHelper { + template struct RemovePointer { + typedef T Type; + }; + template struct RemovePointer { + typedef T Type; + }; + + template struct RemovePointer> { + typedef T Type; + }; + + template struct RemovePointer> { + typedef T Type; + }; + + template struct IsEnumOrConvertibleToInteger { + static const bool value = std::is_integral::value || std::is_enum::value || std::is_convertible::value; + }; + + template struct IsThreadSafeRefCountedPointer { + static const bool value = std::is_convertible::Type*, ThreadSafeRefCounted::Type>*>::value; + }; +}; + +template struct CrossThreadCopierPassThrough { + typedef T Type; + static Type copy(const T& parameter) + { + return parameter; + } +}; + +template struct CrossThreadCopierBase; + +// Integers get passed through without any changes. +template struct CrossThreadCopierBase : public CrossThreadCopierPassThrough { +}; + +// Classes that have an isolatedCopy() method get a default specialization. +template struct CrossThreadCopierBase { + static T copy(const T& value) + { + return value.isolatedCopy(); + } +}; + +// Custom copy methods. +template struct CrossThreadCopierBase { + typedef typename CrossThreadCopierBaseHelper::RemovePointer::Type RefCountedType; + static_assert(std::is_convertible*>::value, "T is not convertible to ThreadSafeRefCounted!"); + + typedef PassRefPtr Type; + static Type copy(const T& refPtr) + { + return refPtr; + } +}; + +template<> struct CrossThreadCopierBase { + typedef std::chrono::system_clock::time_point Type; + static Type copy(const Type& source) + { + return source; + } +}; + +template<> struct CrossThreadCopierBase { + typedef WTF::ASCIILiteral Type; + static Type copy(const Type& source) + { + return source; + } +}; + +template +struct CrossThreadCopier : public CrossThreadCopierBase::value, CrossThreadCopierBaseHelper::IsThreadSafeRefCountedPointer::value, T> { +}; + +// Default specialization for Vectors of CrossThreadCopyable classes. +template struct CrossThreadCopierBase> { + typedef Vector Type; + static Type copy(const Type& source) + { + Type destination; + destination.reserveInitialCapacity(source.size()); + for (auto& object : source) + destination.uncheckedAppend(CrossThreadCopier::copy(object)); + return destination; + } +}; + +} // namespace WTF + +using WTF::CrossThreadCopierBaseHelper; +using WTF::CrossThreadCopierBase; +using WTF::CrossThreadCopier; -- cgit v1.2.1