144b02655878902db03cf16519b3757985cd2d22aChris Lattner//===- llvm/ADT/NullablePtr.h - A pointer that allows null ------*- C++ -*-===//
244b02655878902db03cf16519b3757985cd2d22aChris Lattner//
344b02655878902db03cf16519b3757985cd2d22aChris Lattner//                     The LLVM Compiler Infrastructure
444b02655878902db03cf16519b3757985cd2d22aChris Lattner//
544b02655878902db03cf16519b3757985cd2d22aChris Lattner// This file is distributed under the University of Illinois Open Source
644b02655878902db03cf16519b3757985cd2d22aChris Lattner// License. See LICENSE.TXT for details.
744b02655878902db03cf16519b3757985cd2d22aChris Lattner//
844b02655878902db03cf16519b3757985cd2d22aChris Lattner//===----------------------------------------------------------------------===//
944b02655878902db03cf16519b3757985cd2d22aChris Lattner//
1044b02655878902db03cf16519b3757985cd2d22aChris Lattner// This file defines and implements the NullablePtr class.
1144b02655878902db03cf16519b3757985cd2d22aChris Lattner//
1244b02655878902db03cf16519b3757985cd2d22aChris Lattner//===----------------------------------------------------------------------===//
1344b02655878902db03cf16519b3757985cd2d22aChris Lattner
1444b02655878902db03cf16519b3757985cd2d22aChris Lattner#ifndef LLVM_ADT_NULLABLE_PTR_H
1544b02655878902db03cf16519b3757985cd2d22aChris Lattner#define LLVM_ADT_NULLABLE_PTR_H
1644b02655878902db03cf16519b3757985cd2d22aChris Lattner
1744b02655878902db03cf16519b3757985cd2d22aChris Lattner#include <cassert>
1844b02655878902db03cf16519b3757985cd2d22aChris Lattner#include <cstddef>
1944b02655878902db03cf16519b3757985cd2d22aChris Lattner
2044b02655878902db03cf16519b3757985cd2d22aChris Lattnernamespace llvm {
2144b02655878902db03cf16519b3757985cd2d22aChris Lattner/// NullablePtr pointer wrapper - NullablePtr is used for APIs where a
2244b02655878902db03cf16519b3757985cd2d22aChris Lattner/// potentially-null pointer gets passed around that must be explicitly handled
2344b02655878902db03cf16519b3757985cd2d22aChris Lattner/// in lots of places.  By putting a wrapper around the null pointer, it makes
2444b02655878902db03cf16519b3757985cd2d22aChris Lattner/// it more likely that the null pointer case will be handled correctly.
2544b02655878902db03cf16519b3757985cd2d22aChris Lattnertemplate<class T>
2644b02655878902db03cf16519b3757985cd2d22aChris Lattnerclass NullablePtr {
2744b02655878902db03cf16519b3757985cd2d22aChris Lattner  T *Ptr;
2844b02655878902db03cf16519b3757985cd2d22aChris Lattnerpublic:
2944b02655878902db03cf16519b3757985cd2d22aChris Lattner  NullablePtr(T *P = 0) : Ptr(P) {}
3044b02655878902db03cf16519b3757985cd2d22aChris Lattner
3144b02655878902db03cf16519b3757985cd2d22aChris Lattner  bool isNull() const { return Ptr == 0; }
3244b02655878902db03cf16519b3757985cd2d22aChris Lattner  bool isNonNull() const { return Ptr != 0; }
3344b02655878902db03cf16519b3757985cd2d22aChris Lattner
3444b02655878902db03cf16519b3757985cd2d22aChris Lattner  /// get - Return the pointer if it is non-null.
3544b02655878902db03cf16519b3757985cd2d22aChris Lattner  const T *get() const {
3644b02655878902db03cf16519b3757985cd2d22aChris Lattner    assert(Ptr && "Pointer wasn't checked for null!");
3744b02655878902db03cf16519b3757985cd2d22aChris Lattner    return Ptr;
3844b02655878902db03cf16519b3757985cd2d22aChris Lattner  }
3944b02655878902db03cf16519b3757985cd2d22aChris Lattner
4044b02655878902db03cf16519b3757985cd2d22aChris Lattner  /// get - Return the pointer if it is non-null.
4144b02655878902db03cf16519b3757985cd2d22aChris Lattner  T *get() {
4244b02655878902db03cf16519b3757985cd2d22aChris Lattner    assert(Ptr && "Pointer wasn't checked for null!");
4344b02655878902db03cf16519b3757985cd2d22aChris Lattner    return Ptr;
4444b02655878902db03cf16519b3757985cd2d22aChris Lattner  }
4544b02655878902db03cf16519b3757985cd2d22aChris Lattner
4644b02655878902db03cf16519b3757985cd2d22aChris Lattner  T *getPtrOrNull() { return Ptr; }
4744b02655878902db03cf16519b3757985cd2d22aChris Lattner  const T *getPtrOrNull() const { return Ptr; }
4844b02655878902db03cf16519b3757985cd2d22aChris Lattner};
4944b02655878902db03cf16519b3757985cd2d22aChris Lattner
5044b02655878902db03cf16519b3757985cd2d22aChris Lattner} // end namespace llvm
5144b02655878902db03cf16519b3757985cd2d22aChris Lattner
5244b02655878902db03cf16519b3757985cd2d22aChris Lattner#endif
53