Files
Chris Peterson 1ccbebd6ad Bug 2069689 - storage: Move some constructors and destructors out of line for C++23 compatibility. r=dom-storage-reviewers,janv
C++23 P2448R2 [1] relaxed the requirements for constexpr destructors.
In C++23, UniquePtr's destructor, move constructor, and null assignment
operator constexpr.

FileSystemDatabaseManagerVersion001's inline destructor destroys
UniquePtr<FileSystemFileManager> while FileSystemFileManager is only
forward declared. LSWriteOptimizerBase's inline constructors and Reset()
can destroy or reset UniquePtr<WriteInfo> before the nested WriteInfo
definition.

Move these definitions to the corresponding .cpp files, where the
UniquePtr pointee types are complete.

[1] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2448r2.html

obj-aarch64-apple-darwin25.3.0/dist/include/mozilla/dom/LSWriteOptimizer.h:43:3: note: in instantiation of member function 'std::unique_ptr<mozilla::dom::LSWriteOptimizerBase::WriteInfo>::~unique_ptr' requested here
   43 |   LSWriteOptimizerBase() : mLastSerialNumber(0), mTotalDelta(0) {}
      |   ^
obj-aarch64-apple-darwin25.3.0/dist/include/mozilla/dom/LSWriteOptimizer.h:31:9: note: forward declaration of 'mozilla::dom::LSWriteOptimizerBase::WriteInfo'
   31 |   class WriteInfo;
      |         ^

Differential Revision: https://phabricator.services.mozilla.com/D323892
2026-09-11 07:18:21 +00:00

94 lines
2.4 KiB
C++

/* 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 "LSWriteOptimizer.h"
#include <new>
#include <utility>
#include "nsBaseHashtable.h"
#include "nsTArray.h"
namespace mozilla::dom {
LSWriteOptimizerBase::LSWriteOptimizerBase()
: mLastSerialNumber(0), mTotalDelta(0) {}
LSWriteOptimizerBase::LSWriteOptimizerBase(
LSWriteOptimizerBase&& aWriteOptimizer)
: mTruncateInfo(std::move(aWriteOptimizer.mTruncateInfo)) {
AssertIsOnOwningThread();
MOZ_ASSERT(&aWriteOptimizer != this);
mWriteInfos.SwapElements(aWriteOptimizer.mWriteInfos);
mTotalDelta = aWriteOptimizer.mTotalDelta;
aWriteOptimizer.mTotalDelta = 0;
}
class LSWriteOptimizerBase::WriteInfoComparator {
public:
bool Equals(const WriteInfo* a, const WriteInfo* b) const {
MOZ_ASSERT(a && b);
return a->SerialNumber() == b->SerialNumber();
}
bool LessThan(const WriteInfo* a, const WriteInfo* b) const {
MOZ_ASSERT(a && b);
return a->SerialNumber() < b->SerialNumber();
}
};
void LSWriteOptimizerBase::DeleteItem(const nsAString& aKey, int64_t aDelta) {
AssertIsOnOwningThread();
mWriteInfos.WithEntryHandle(aKey, [&](auto&& entry) {
if (entry && entry.Data()->GetType() == WriteInfo::InsertItem) {
entry.Remove();
} else {
entry.InsertOrUpdate(
MakeUnique<DeleteItemInfo>(NextSerialNumber(), aKey));
}
});
mTotalDelta += aDelta;
}
void LSWriteOptimizerBase::Truncate(int64_t aDelta) {
AssertIsOnOwningThread();
mWriteInfos.Clear();
if (!mTruncateInfo) {
mTruncateInfo = MakeUnique<TruncateInfo>(NextSerialNumber());
}
mTotalDelta += aDelta;
}
void LSWriteOptimizerBase::Reset() {
AssertIsOnOwningThread();
mTruncateInfo = nullptr;
mWriteInfos.Clear();
}
void LSWriteOptimizerBase::GetSortedWriteInfos(
nsTArray<NotNull<WriteInfo*>>& aWriteInfos) {
AssertIsOnOwningThread();
if (mTruncateInfo) {
aWriteInfos.InsertElementSorted(WrapNotNullUnchecked(mTruncateInfo.get()),
WriteInfoComparator());
}
for (const auto& entry : mWriteInfos) {
WriteInfo* writeInfo = entry.GetWeak();
aWriteInfos.InsertElementSorted(WrapNotNull(writeInfo),
WriteInfoComparator());
}
}
} // namespace mozilla::dom