1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
/*=========================================================================
*
* Copyright NumFOCUS
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
/*=========================================================================
*
* Portions of this file are subject to the VTK Toolkit Version 3 copyright.
*
* Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
*
* For complete copyright, license and disclaimer of warranty information
* please refer to the NOTICE file at the top of the ITK source tree.
*
*=========================================================================*/
#ifndef itkTimeStamp_h
#define itkTimeStamp_h
#include "itkMacro.h"
#include "itkIntTypes.h"
#include <atomic>
#include "itkSingletonMacro.h"
namespace itk
{
/** \class TimeStamp
* \brief Generate a unique, increasing time value.
*
* TimeStamp records a unique time when the method Modified() is
* executed. This time is guaranteed to be monotonically increasing.
* Classes use this object to record modified and/or execution time.
* There is built in support for the binary < and > comparison
* operators between two TimeStamp objects.
*
* \warning On most platforms, this class uses a lock-free incremental
* counter. The Modified function can safely be called simultaneously
* by multiple threads on different instances of the class. However,
* calling the Modified function by different threads on the same
* instance of the class can lead to some unexpected behavior. The
* global counter will always be correct but the local m_ModifiedTime
* might not (see
* https://www.itk.org/mailman/private/insight-developers/2009-February/011732.html
* for more detail).
*
* \ingroup ITKSystemObjects
* \ingroup ITKCommon
*/
class ITKCommon_EXPORT TimeStamp
{
public:
/** Standard class type aliases. */
using Self = TimeStamp;
using GlobalTimeStampType = std::atomic<ModifiedTimeType>;
/** Create an instance of this class. We don't want to use reference
* counting. */
static Self *
New();
/** Destroy this instance. */
void
Delete()
{
delete this;
}
/** The class name as a string. */
static const char *
GetNameOfClass()
{
return "TimeStamp";
}
/** Set this objects time to the current time. The current time is just a
* monotonically increasing unsigned long integer. It is possible for this
* number to wrap around back to zero. This should only happen for
* processes that have been running for a very long time, while constantly
* changing objects within the program. When this does occur, the typical
* consequence should be that some filters will update themselves when
* really they don't need to. */
void
Modified();
/** Return this object's Modified time. */
ModifiedTimeType
GetMTime() const
{
return m_ModifiedTime;
}
/** Support comparisons of time stamp objects directly. */
bool
operator>(TimeStamp & ts) const
{
return (m_ModifiedTime > ts.m_ModifiedTime);
}
bool
operator<(TimeStamp & ts) const
{
return (m_ModifiedTime < ts.m_ModifiedTime);
}
/** Allow for typecasting to unsigned long. */
operator ModifiedTimeType() const { return m_ModifiedTime; }
private:
/** Set/Get the pointer to GlobalTimeStamp.
* Note that SetGlobalTimeStamp is not concurrent thread safe. */
itkGetGlobalDeclarationMacro(GlobalTimeStampType, GlobalTimeStamp);
ModifiedTimeType m_ModifiedTime{ 0 };
/** The static GlobalTimeStamp. This is initialized to NULL as the first
* stage of static initialization. It is then populated on the first call to
* itk::TimeStamp::Modified() but it can be overridden with SetGlobalTimeStamp().
* */
static GlobalTimeStampType * m_GlobalTimeStamp;
};
} // end namespace itk
#endif
|