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