Bug 968520 - Add nsTArray::Assign. r=froydnj

This commit is contained in:
Birunthan Mohanathas 2015-07-07 11:27:03 -07:00
Родитель e98d080be8
Коммит 30fedff9e1
3 изменённых файлов: 83 добавлений и 0 удалений

Просмотреть файл

@ -1175,6 +1175,31 @@ public:
// //
// Mutation methods // Mutation methods
// //
template<class Allocator, typename ActualAlloc = Alloc>
typename ActualAlloc::ResultType Assign(
const nsTArray_Impl<E, Allocator>& aOther)
{
return ActualAlloc::ConvertBoolToResultType(
!!ReplaceElementsAt<E, ActualAlloc>(0, Length(),
aOther.Elements(), aOther.Length()));
}
template<class Allocator>
/* MOZ_WARN_UNUSED_RESULT */
bool Assign(const nsTArray_Impl<E, Allocator>& aOther,
const mozilla::fallible_t&)
{
return Assign<Allocator, FallibleAlloc>(aOther);
}
template<class Allocator>
void Assign(nsTArray_Impl<E, Allocator>&& aOther)
{
Clear();
SwapElements(aOther);
}
// This method call the destructor on each element of the array, empties it, // This method call the destructor on each element of the array, empties it,
// but does not shrink the array's capacity. // but does not shrink the array's capacity.
// See also SetLengthAndRetainStorage. // See also SetLengthAndRetainStorage.

Просмотреть файл

@ -0,0 +1,57 @@
/* -*- 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 "nsTArray.h"
#include "gtest/gtest.h"
using namespace mozilla;
namespace TestTArray {
const nsTArray<int>& DummyArray()
{
static nsTArray<int> sArray;
if (sArray.IsEmpty()) {
const int data[] = {4, 1, 2, 8};
sArray.AppendElements(data, ArrayLength(data));
}
return sArray;
}
// This returns an invalid nsTArray with a huge length in order to test that
// fallible operations actually fail.
#ifdef DEBUG
const nsTArray<int>& FakeHugeArray()
{
static nsTArray<int> sArray;
if (sArray.IsEmpty()) {
sArray.AppendElement();
((nsTArrayHeader*)sArray.DebugGetHeader())->mLength = UINT32_MAX;
}
return sArray;
}
#endif
TEST(TArray, assign)
{
nsTArray<int> array;
array.Assign(DummyArray());
ASSERT_EQ(DummyArray(), array);
ASSERT_TRUE(array.Assign(DummyArray(), fallible));
ASSERT_EQ(DummyArray(), array);
#ifdef DEBUG
ASSERT_FALSE(array.Assign(FakeHugeArray(), fallible));
#endif
nsTArray<int> array2;
array2.Assign(Move(array));
ASSERT_TRUE(array.IsEmpty());
ASSERT_EQ(DummyArray(), array2);
}
}

Просмотреть файл

@ -17,6 +17,7 @@ UNIFIED_SOURCES += [
'TestStrings.cpp', 'TestStrings.cpp',
'TestStringStream.cpp', 'TestStringStream.cpp',
'TestSynchronization.cpp', 'TestSynchronization.cpp',
'TestTArray.cpp',
'TestThreadPool.cpp', 'TestThreadPool.cpp',
'TestThreads.cpp', 'TestThreads.cpp',
'TestTimeStamp.cpp', 'TestTimeStamp.cpp',