Skip to content
Snippets Groups Projects
Commit 03c1e5e0 authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files
parents 9930e22a 29dd5f01
No related branches found
No related tags found
Loading
......@@ -27,6 +27,7 @@
#define LLSAFEHANDLE_H
#include "llerror.h" // *TODO: consider eliminating this
#include "llsingleton.h"
// Expands LLPointer to return a pointer to a special instance of class Type instead of NULL.
// This is useful in instances where operations on NULL pointers are semantically safe and/or
......@@ -146,15 +147,24 @@ class LLSafeHandle
}
}
static Type* nonNull(Type* ptr)
// Define an LLSingleton whose sole purpose is to hold a "null instance"
// of the subject Type: the canonical instance to dereference if this
// LLSafeHandle actually holds a null pointer. We use LLSingleton
// specifically so that the "null instance" can be cleaned up at a well-
// defined time, specifically LLSingletonBase::deleteAll().
// Of course, as with any LLSingleton, the "null instance" is only
// instantiated on demand -- in this case, if you actually try to
// dereference an LLSafeHandle containing null.
class NullInstanceHolder: public LLSingleton<NullInstanceHolder>
{
return ptr == NULL ? sNullFunc() : ptr;
}
LLSINGLETON_EMPTY_CTOR(NullInstanceHolder);
public:
Type mNullInstance;
};
static Type* sNullFunc()
static Type* nonNull(Type* ptr)
{
static Type sInstance;
return &sInstance;
return ptr? ptr : &NullInstanceHolder::instance().mNullInstance;
}
protected:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment