mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1228641. Add a polyfill of std::initializer_list. r=froydnj
This commit is contained in:
parent
b0b7c1be98
commit
af079e4ea0
@ -20,6 +20,7 @@ new
|
||||
algorithm
|
||||
atomic
|
||||
deque
|
||||
initializer_list
|
||||
ios
|
||||
iosfwd
|
||||
iostream
|
||||
|
@ -548,6 +548,7 @@ image.h
|
||||
imagehlp.h
|
||||
imm.h
|
||||
initguid.h
|
||||
initializer_list
|
||||
InterfaceDefs.h
|
||||
InternetConfig.h
|
||||
IntlResources.h
|
||||
|
62
mfbt/InitializerList.h
Normal file
62
mfbt/InitializerList.h
Normal file
@ -0,0 +1,62 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* * License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
/* A polyfill for std::initializer_list if it doesn't exist */
|
||||
|
||||
#ifndef mozilla_InitializerList_h
|
||||
#define mozilla_InitializerList_h
|
||||
|
||||
#include <mozilla/Compiler.h>
|
||||
#include <mozilla/Attributes.h>
|
||||
#if MOZ_USING_LIBCXX
|
||||
# define MOZ_HAVE_INITIALIZER_LIST
|
||||
#elif MOZ_USING_LIBSTDCXX && __GLIBCXX__ >= 20090421 // GCC 4.4.0
|
||||
# define MOZ_HAVE_INITIALIZER_LIST
|
||||
#elif _MSC_VER
|
||||
# define MOZ_HAVE_INITIALIZER_LIST
|
||||
#elif defined(MOZ_USING_STLPORT)
|
||||
#else
|
||||
# error "Unknown standard library situation"
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_HAVE_INITIALIZER_LIST
|
||||
# include <initializer_list>
|
||||
#else
|
||||
/* Normally we would put things in mozilla:: however, std::initializer_list is a
|
||||
* magic name used by the compiler and so we need to name it that way.
|
||||
*/
|
||||
namespace std
|
||||
{
|
||||
|
||||
template<class T>
|
||||
class initializer_list
|
||||
{
|
||||
/* This matches the representation used by GCC and Clang which
|
||||
* are the only compilers we need to polyfill */
|
||||
const T* mBegin;
|
||||
size_t mSize;
|
||||
|
||||
/* This constructor is called directly by the compiler */
|
||||
initializer_list(const T* begin, size_t size) : mBegin(begin), mSize(size) {}
|
||||
public:
|
||||
|
||||
MOZ_CONSTEXPR initializer_list() : mBegin(nullptr), mSize(0) {}
|
||||
|
||||
typedef T value_type;
|
||||
typedef const T& reference;
|
||||
typedef const T& const_reference;
|
||||
typedef size_t size_type;
|
||||
typedef const T* iterator;
|
||||
typedef const T* const_iterator;
|
||||
|
||||
size_t size() const { return mSize; }
|
||||
const T* begin() const { return mBegin; }
|
||||
const T* end() const { return mBegin + mSize; }
|
||||
};
|
||||
|
||||
}
|
||||
#endif /* MOZ_HAS_INITIALIZER_LIST */
|
||||
#endif /* mozilla_InitializerList_h */
|
@ -44,6 +44,7 @@ EXPORTS.mozilla = [
|
||||
'GuardObjects.h',
|
||||
'HashFunctions.h',
|
||||
'IndexSequence.h',
|
||||
'InitializerList.h',
|
||||
'IntegerPrintfMacros.h',
|
||||
'IntegerRange.h',
|
||||
'IntegerTypeTraits.h',
|
||||
|
24
mfbt/tests/TestInitializerList.cpp
Normal file
24
mfbt/tests/TestInitializerList.cpp
Normal file
@ -0,0 +1,24 @@
|
||||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include "mozilla/Assertions.h"
|
||||
#include "mozilla/InitializerList.h"
|
||||
|
||||
int sum(std::initializer_list<int> p)
|
||||
{
|
||||
int result = 0;
|
||||
for (auto i : p) {
|
||||
result += i;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
MOZ_RELEASE_ASSERT(sum({1, 2, 3, 4, 5, 6}) == 7 * 3);
|
||||
return 0;
|
||||
}
|
@ -19,6 +19,7 @@ CppUnitTests([
|
||||
'TestFastBernoulliTrial',
|
||||
'TestFloatingPoint',
|
||||
'TestFunction',
|
||||
'TestInitializerList',
|
||||
'TestIntegerPrintfMacros',
|
||||
'TestIntegerRange',
|
||||
'TestJSONWriter',
|
||||
|
@ -38,6 +38,7 @@ skip-if = os != 'win'
|
||||
[TestGetURL]
|
||||
[TestHashtables]
|
||||
[TestID]
|
||||
[TestInitializerList]
|
||||
[TestIntegerPrintfMacros]
|
||||
[TestIntegerRange]
|
||||
[TestJSONWriter]
|
||||
|
Loading…
Reference in New Issue
Block a user