0029303: Data Exchange - add RWObj_CafWriter tool for wavefront OBJ file
[occt.git] / src / Message / Message_LazyProgressScope.hxx
1 // Copyright (c) 2017-2021 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14 #ifndef _Message_LazyProgressScope_HeaderFiler
15 #define _Message_LazyProgressScope_HeaderFiler
16
17 #include <Message_ProgressScope.hxx>
18
19 //! Progress scope with lazy updates and abort fetches.
20 //!
21 //! Although Message_ProgressIndicator implementation is encouraged to spare GUI updates,
22 //! even optimized implementation might show a noticeable overhead on a very small update step (e.g. per triangle).
23 //!
24 //! The class splits initial (displayed) number of overall steps into larger chunks specified in constructor,
25 //! so that displayed progress is updated at larger steps.
26 class Message_LazyProgressScope : protected Message_ProgressScope
27 {
28 public:
29
30   //! Main constructor.
31   //! @param theRange [in] progress range to scope
32   //! @param theName  [in] name of this scope
33   //! @param theMax   [in] number of steps within this scope
34   //! @param thePatchStep [in] number of steps to update progress
35   //! @param theIsInf [in] infinite flag
36   Message_LazyProgressScope (const Message_ProgressRange& theRange,
37                              const char* theName,
38                              const Standard_Real theMax,
39                              const Standard_Real thePatchStep,
40                              const Standard_Boolean theIsInf = Standard_False)
41   : Message_ProgressScope (theRange, theName, theMax, theIsInf),
42     myPatchStep (thePatchStep),
43     myPatchProgress (0.0),
44     myIsLazyAborted (Standard_False) {}
45
46   //! Increment progress with 1.
47   void Next()
48   {
49     if (++myPatchProgress < myPatchStep)
50     {
51       return;
52     }
53
54     myPatchProgress = 0.0;
55     Message_ProgressScope::Next (myPatchStep);
56     IsAborted();
57   }
58
59   //! Return TRUE if progress has been aborted - return the cached state lazily updated.
60   Standard_Boolean More() const
61   {
62     return !myIsLazyAborted;
63   }
64
65   //! Return TRUE if progress has been aborted - fetches actual value from the Progress.
66   Standard_Boolean IsAborted()
67   {
68     myIsLazyAborted = myIsLazyAborted || !Message_ProgressScope::More();
69     return myIsLazyAborted;
70   }
71
72 protected:
73
74   Standard_Real    myPatchStep;
75   Standard_Real    myPatchProgress;
76   Standard_Boolean myIsLazyAborted;
77
78 };
79
80 #endif // _Message_LazyProgressScope_HeaderFiler