DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (c68fe15a81fc)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
/* -*- 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/. */
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_dom_Nullable_h
#define mozilla_dom_Nullable_h

#include <ostream>
#include <ostream>
#include <utility>

#include "mozilla/Assertions.h"
#include "mozilla/Maybe.h"
#include "nsTArrayForwardDeclare.h"
#include "nsTArrayForwardDeclare.h"

class nsCycleCollectionTraversalCallback;

namespace mozilla {
namespace dom {
namespace dom {

// Support for nullable types
template <typename T>
struct Nullable {
 private:
 private:
  Maybe<T> mValue;

 public:
  Nullable() : mValue() {}

  MOZ_IMPLICIT Nullable(const decltype(nullptr)&) : mValue() {}

  explicit Nullable(const T& aValue) : mValue() { mValue.emplace(aValue); }


  MOZ_IMPLICIT Nullable(T&& aValue) : mValue() {
    mValue.emplace(std::move(aValue));
  }
  }

  Nullable(Nullable<T>&& aOther) : mValue(std::move(aOther.mValue)) {}

  Nullable(const Nullable<T>& aOther) : mValue(aOther.mValue) {}


  void operator=(const Nullable<T>& aOther) { mValue = aOther.mValue; }

  void SetValue(const T& aArgs) {
    mValue.reset();
    mValue.emplace(aArgs);
    mValue.emplace(aArgs);
  }

  void SetValue(T&& aArgs) {
    mValue.reset();
    mValue.emplace(std::move(aArgs));
    mValue.emplace(std::move(aArgs));
  }

  // For cases when |T| is some type with nontrivial copy behavior, we may want
  // to get a reference to our internal copy of T and work with it directly
  // to get a reference to our internal copy of T and work with it directly
  // instead of relying on the copying version of SetValue().
  T& SetValue() {
    if (mValue.isNothing()) {
      mValue.emplace();
    }
    }
    return mValue.ref();
  }

  void SetNull() { mValue.reset(); }


  const T& Value() const { return mValue.ref(); }

  T& Value() { return mValue.ref(); }

  bool IsNull() const { return mValue.isNothing(); }
  bool IsNull() const { return mValue.isNothing(); }

  bool Equals(const Nullable<T>& aOtherNullable) const {
    return mValue == aOtherNullable.mValue;
  }


  bool operator==(const Nullable<T>& aOtherNullable) const {
    return Equals(aOtherNullable);
  }

  bool operator!=(const Nullable<T>& aOtherNullable) const {
  bool operator!=(const Nullable<T>& aOtherNullable) const {
    return !Equals(aOtherNullable);
  }

  friend std::ostream& operator<<(std::ostream& aStream,
                                  const Nullable& aNullable) {
                                  const Nullable& aNullable) {
    return aStream << aNullable.mValue;
  }
};

template <typename T>
void ImplCycleCollectionTraverse(nsCycleCollectionTraversalCallback& aCallback,
                                 Nullable<T>& aNullable, const char* aName,
                                 Nullable<T>& aNullable, const char* aName,
                                 uint32_t aFlags = 0) {
  if (!aNullable.IsNull()) {
    ImplCycleCollectionTraverse(aCallback, aNullable.Value(), aName, aFlags);
  }
}
}

template <typename T>
void ImplCycleCollectionUnlink(Nullable<T>& aNullable) {
  if (!aNullable.IsNull()) {
    ImplCycleCollectionUnlink(aNullable.Value());
    ImplCycleCollectionUnlink(aNullable.Value());
  }
}

}  // namespace dom
}  // namespace mozilla
}  // namespace mozilla

#endif /* mozilla_dom_Nullable_h */