dom/bindings/Nullable.h
author Arnaud Bienner <arnaud.bienner@gmail.com>
Thu, 03 May 2012 00:49:24 +0200
changeset 97035 5a0fe30e6b1a9822242e9fcd002a6df6f690d645
parent 96968 3c35768445119d3eb1a86293e73158576c94dafc
child 98099 a23d7ab147321ae42dcd8565172cca9ea4c07ad8
permissions -rw-r--r--
Bug 565274 - Implement the accept attribute for the form and file upload controls for custom MIME types. r=sicking

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/
/* vim: set ts=2 sw=2 et tw=79: */
/* 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/. */

#ifndef mozilla_dom_Nullable_h
#define mozilla_dom_Nullable_h

#include "mozilla/Assertions.h"

namespace mozilla {
namespace dom {

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

public:
  Nullable()
    : mIsNull(true)
  {}

  Nullable(T aValue)
    : mValue(aValue)
    , mIsNull(false)
  {}

  void SetValue(T aValue) {
    mValue = aValue;
    mIsNull = false;
  }

  // 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
  // instead of relying on the copying version of SetValue().
  T& SetValue() {
    mIsNull = false;
    return mValue;
  }

  void SetNull() {
    mIsNull = true;
  }

  const T& Value() const {
    MOZ_ASSERT(!mIsNull);
    return mValue;
  }

  bool IsNull() const {
    return mIsNull;
  }
};

} // namespace dom
} // namespace mozilla

#endif /* mozilla_dom_Nullable_h */