File: itkTimeStamp.h

package info (click to toggle)
insighttoolkit5 5.4.3-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 704,384 kB
  • sloc: cpp: 783,592; ansic: 628,724; xml: 44,704; fortran: 34,250; python: 22,874; sh: 4,078; pascal: 2,636; lisp: 2,158; makefile: 464; yacc: 328; asm: 205; perl: 203; lex: 146; tcl: 132; javascript: 98; csh: 81
file content (134 lines) | stat: -rw-r--r-- 4,391 bytes parent folder | download
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