]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/common/mutex.h
ICU-62141.0.1.tar.gz
[apple/icu.git] / icuSources / common / mutex.h
index af8cd8cb9c24e0a72d149a409f0b72679e456d2a..bb45e7df83cf93b79735212414b7274946d4b656 100644 (file)
@@ -1,7 +1,9 @@
+// © 2016 and later: Unicode, Inc. and others.
+// License & terms of use: http://www.unicode.org/copyright.html
 /*
 ******************************************************************************
 *
-*   Copyright (C) 1997-2012, International Business Machines
+*   Copyright (C) 1997-2013, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *
 ******************************************************************************
@@ -71,127 +73,6 @@ inline Mutex::~Mutex()
   umtx_unlock(fMutex);
 }
 
-// common code for singletons ---------------------------------------------- ***
-
-/**
- * Function pointer for the instantiator parameter of
- * SimpleSingleton::getInstance() and TriStateSingleton::getInstance().
- * The function creates some object, optionally using the context parameter.
- * The function need not check for U_FAILURE(errorCode).
- */
-typedef void *InstantiatorFn(const void *context, UErrorCode &errorCode);
-
-/**
- * Singleton struct with shared instantiation/mutexing code.
- * Simple: Does not remember if a previous instantiation failed.
- * Best used if the instantiation can really only fail with an out-of-memory error,
- * otherwise use a TriStateSingleton.
- * Best used via SimpleSingletonWrapper or similar.
- * Define a static SimpleSingleton instance via the STATIC_SIMPLE_SINGLETON macro.
- */
-struct SimpleSingleton {
-    void *fInstance;
-
-    /**
-     * Returns the singleton instance, or NULL if it could not be created.
-     * Calls the instantiator with the context if the instance has not been
-     * created yet. In a race condition, the duplicate may not be NULL.
-     * The caller must delete the duplicate.
-     * The caller need not initialize the duplicate before the call.
-     */
-    void *getInstance(InstantiatorFn *instantiator, const void *context,
-                      void *&duplicate,
-                      UErrorCode &errorCode);
-    /**
-     * Resets the fields. The caller must have deleted the singleton instance.
-     * Not mutexed.
-     * Call this from a cleanup function.
-     */
-    void reset() { fInstance=NULL; }
-};
-
-#define STATIC_SIMPLE_SINGLETON(name) static SimpleSingleton name={ NULL }
-
-/**
- * Handy wrapper for a SimpleSingleton.
- * Intended for temporary use on the stack, to make the SimpleSingleton easier to deal with.
- * Takes care of the duplicate deletion and type casting.
- */
-template<typename T>
-class SimpleSingletonWrapper {
-public:
-    SimpleSingletonWrapper(SimpleSingleton &s) : singleton(s) {}
-    void deleteInstance() {
-        delete (T *)singleton.fInstance;
-        singleton.reset();
-    }
-    T *getInstance(InstantiatorFn *instantiator, const void *context,
-                   UErrorCode &errorCode) {
-        void *duplicate;
-        T *instance=(T *)singleton.getInstance(instantiator, context, duplicate, errorCode);
-        delete (T *)duplicate;
-        return instance;
-    }
-private:
-    SimpleSingleton &singleton;
-};
-
-/**
- * Singleton struct with shared instantiation/mutexing code.
- * Tri-state: Instantiation succeeded/failed/not attempted yet.
- * Best used via TriStateSingletonWrapper or similar.
- * Define a static TriStateSingleton instance via the STATIC_TRI_STATE_SINGLETON macro.
- */
-struct TriStateSingleton {
-    void *fInstance;
-    UErrorCode fErrorCode;
-
-    /**
-     * Returns the singleton instance, or NULL if it could not be created.
-     * Calls the instantiator with the context if the instance has not been
-     * created yet. In a race condition, the duplicate may not be NULL.
-     * The caller must delete the duplicate.
-     * The caller need not initialize the duplicate before the call.
-     * The singleton creation is only attempted once. If it fails,
-     * the singleton will then always return NULL.
-     */
-    void *getInstance(InstantiatorFn *instantiator, const void *context,
-                      void *&duplicate,
-                      UErrorCode &errorCode);
-    /**
-     * Resets the fields. The caller must have deleted the singleton instance.
-     * Not mutexed.
-     * Call this from a cleanup function.
-     */
-    void reset();
-};
-
-#define STATIC_TRI_STATE_SINGLETON(name) static TriStateSingleton name={ NULL, U_ZERO_ERROR }
-
-/**
- * Handy wrapper for a TriStateSingleton.
- * Intended for temporary use on the stack, to make the TriStateSingleton easier to deal with.
- * Takes care of the duplicate deletion and type casting.
- */
-template<typename T>
-class TriStateSingletonWrapper {
-public:
-    TriStateSingletonWrapper(TriStateSingleton &s) : singleton(s) {}
-    void deleteInstance() {
-        delete (T *)singleton.fInstance;
-        singleton.reset();
-    }
-    T *getInstance(InstantiatorFn *instantiator, const void *context,
-                   UErrorCode &errorCode) {
-        void *duplicate;
-        T *instance=(T *)singleton.getInstance(instantiator, context, duplicate, errorCode);
-        delete (T *)duplicate;
-        return instance;
-    }
-private:
-    TriStateSingleton &singleton;
-};
-
 U_NAMESPACE_END
 
 #endif //_MUTEX_