Blame xpcom/threads/LeakRefPtr.h

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit f0b94e
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
/* Smart pointer which leaks its owning refcounted object by default. */
Packit f0b94e
Packit f0b94e
#ifndef LeakRefPtr_h
Packit f0b94e
#define LeakRefPtr_h
Packit f0b94e
Packit f0b94e
#include "mozilla/AlreadyAddRefed.h"
Packit f0b94e
Packit f0b94e
namespace mozilla {
Packit f0b94e
Packit f0b94e
/**
Packit f0b94e
 * Instance of this class behaves like a raw pointer which leaks the
Packit f0b94e
 * resource it's owning if not explicitly released.
Packit f0b94e
 */
Packit f0b94e
template <class T>
Packit f0b94e
class LeakRefPtr {
Packit f0b94e
 public:
Packit f0b94e
  explicit LeakRefPtr(already_AddRefed<T>&& aPtr) : mRawPtr(aPtr.take()) {}
Packit f0b94e
Packit f0b94e
  explicit operator bool() const { return !!mRawPtr; }
Packit f0b94e
Packit f0b94e
  LeakRefPtr<T>& operator=(already_AddRefed<T>&& aPtr) {
Packit f0b94e
    mRawPtr = aPtr.take();
Packit f0b94e
    return *this;
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  T* get() const { return mRawPtr; }
Packit f0b94e
Packit f0b94e
  already_AddRefed<T> take() {
Packit f0b94e
    T* rawPtr = mRawPtr;
Packit f0b94e
    mRawPtr = nullptr;
Packit f0b94e
    return already_AddRefed<T>(rawPtr);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  void release() { NS_RELEASE(mRawPtr); }
Packit f0b94e
Packit f0b94e
 private:
Packit f0b94e
  T* MOZ_OWNING_REF mRawPtr;
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
}  // namespace mozilla
Packit f0b94e
Packit f0b94e
#endif  // LeakRefPtr_h