migrating to the latest JUCE version
This commit is contained in:
@ -1,132 +1,132 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
static void appendToFile (const File& f, const String& s)
|
||||
{
|
||||
if (f.getFullPathName().isNotEmpty())
|
||||
{
|
||||
FileOutputStream out (f);
|
||||
|
||||
if (! out.failedToOpen())
|
||||
out << s << newLine;
|
||||
}
|
||||
}
|
||||
|
||||
PerformanceCounter::PerformanceCounter (const String& name, int runsPerPrintout, const File& loggingFile)
|
||||
: runsPerPrint (runsPerPrintout), startTime (0), outputFile (loggingFile)
|
||||
{
|
||||
stats.name = name;
|
||||
appendToFile (outputFile, "**** Counter for \"" + name + "\" started at: " + Time::getCurrentTime().toString (true, true));
|
||||
}
|
||||
|
||||
PerformanceCounter::~PerformanceCounter()
|
||||
{
|
||||
if (stats.numRuns > 0)
|
||||
printStatistics();
|
||||
}
|
||||
|
||||
PerformanceCounter::Statistics::Statistics() noexcept
|
||||
: averageSeconds(), maximumSeconds(), minimumSeconds(), totalSeconds(), numRuns()
|
||||
{
|
||||
}
|
||||
|
||||
void PerformanceCounter::Statistics::clear() noexcept
|
||||
{
|
||||
averageSeconds = maximumSeconds = minimumSeconds = totalSeconds = 0;
|
||||
numRuns = 0;
|
||||
}
|
||||
|
||||
void PerformanceCounter::Statistics::addResult (double elapsed) noexcept
|
||||
{
|
||||
if (numRuns == 0)
|
||||
{
|
||||
maximumSeconds = elapsed;
|
||||
minimumSeconds = elapsed;
|
||||
}
|
||||
else
|
||||
{
|
||||
maximumSeconds = jmax (maximumSeconds, elapsed);
|
||||
minimumSeconds = jmin (minimumSeconds, elapsed);
|
||||
}
|
||||
|
||||
++numRuns;
|
||||
totalSeconds += elapsed;
|
||||
}
|
||||
|
||||
static String timeToString (double secs)
|
||||
{
|
||||
return String ((int64) (secs * (secs < 0.01 ? 1000000.0 : 1000.0) + 0.5))
|
||||
+ (secs < 0.01 ? " microsecs" : " millisecs");
|
||||
}
|
||||
|
||||
String PerformanceCounter::Statistics::toString() const
|
||||
{
|
||||
MemoryOutputStream s;
|
||||
|
||||
s << "Performance count for \"" << name << "\" over " << numRuns << " run(s)" << newLine
|
||||
<< "Average = " << timeToString (averageSeconds)
|
||||
<< ", minimum = " << timeToString (minimumSeconds)
|
||||
<< ", maximum = " << timeToString (maximumSeconds)
|
||||
<< ", total = " << timeToString (totalSeconds);
|
||||
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
void PerformanceCounter::start() noexcept
|
||||
{
|
||||
startTime = Time::getHighResolutionTicks();
|
||||
}
|
||||
|
||||
bool PerformanceCounter::stop()
|
||||
{
|
||||
stats.addResult (Time::highResolutionTicksToSeconds (Time::getHighResolutionTicks() - startTime));
|
||||
|
||||
if (stats.numRuns < runsPerPrint)
|
||||
return false;
|
||||
|
||||
printStatistics();
|
||||
return true;
|
||||
}
|
||||
|
||||
void PerformanceCounter::printStatistics()
|
||||
{
|
||||
const String desc (getStatisticsAndReset().toString());
|
||||
|
||||
Logger::writeToLog (desc);
|
||||
appendToFile (outputFile, desc);
|
||||
}
|
||||
|
||||
PerformanceCounter::Statistics PerformanceCounter::getStatisticsAndReset()
|
||||
{
|
||||
Statistics s (stats);
|
||||
stats.clear();
|
||||
|
||||
if (s.numRuns > 0)
|
||||
s.averageSeconds = s.totalSeconds / (float) s.numRuns;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
} // namespace juce
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
static void appendToFile (const File& f, const String& s)
|
||||
{
|
||||
if (f.getFullPathName().isNotEmpty())
|
||||
{
|
||||
FileOutputStream out (f);
|
||||
|
||||
if (! out.failedToOpen())
|
||||
out << s << newLine;
|
||||
}
|
||||
}
|
||||
|
||||
PerformanceCounter::PerformanceCounter (const String& name, int runsPerPrintout, const File& loggingFile)
|
||||
: runsPerPrint (runsPerPrintout), startTime (0), outputFile (loggingFile)
|
||||
{
|
||||
stats.name = name;
|
||||
appendToFile (outputFile, "**** Counter for \"" + name + "\" started at: " + Time::getCurrentTime().toString (true, true));
|
||||
}
|
||||
|
||||
PerformanceCounter::~PerformanceCounter()
|
||||
{
|
||||
if (stats.numRuns > 0)
|
||||
printStatistics();
|
||||
}
|
||||
|
||||
PerformanceCounter::Statistics::Statistics() noexcept
|
||||
: averageSeconds(), maximumSeconds(), minimumSeconds(), totalSeconds(), numRuns()
|
||||
{
|
||||
}
|
||||
|
||||
void PerformanceCounter::Statistics::clear() noexcept
|
||||
{
|
||||
averageSeconds = maximumSeconds = minimumSeconds = totalSeconds = 0;
|
||||
numRuns = 0;
|
||||
}
|
||||
|
||||
void PerformanceCounter::Statistics::addResult (double elapsed) noexcept
|
||||
{
|
||||
if (numRuns == 0)
|
||||
{
|
||||
maximumSeconds = elapsed;
|
||||
minimumSeconds = elapsed;
|
||||
}
|
||||
else
|
||||
{
|
||||
maximumSeconds = jmax (maximumSeconds, elapsed);
|
||||
minimumSeconds = jmin (minimumSeconds, elapsed);
|
||||
}
|
||||
|
||||
++numRuns;
|
||||
totalSeconds += elapsed;
|
||||
}
|
||||
|
||||
static String timeToString (double secs)
|
||||
{
|
||||
return String ((int64) (secs * (secs < 0.01 ? 1000000.0 : 1000.0) + 0.5))
|
||||
+ (secs < 0.01 ? " microsecs" : " millisecs");
|
||||
}
|
||||
|
||||
String PerformanceCounter::Statistics::toString() const
|
||||
{
|
||||
MemoryOutputStream s;
|
||||
|
||||
s << "Performance count for \"" << name << "\" over " << numRuns << " run(s)" << newLine
|
||||
<< "Average = " << timeToString (averageSeconds)
|
||||
<< ", minimum = " << timeToString (minimumSeconds)
|
||||
<< ", maximum = " << timeToString (maximumSeconds)
|
||||
<< ", total = " << timeToString (totalSeconds);
|
||||
|
||||
return s.toString();
|
||||
}
|
||||
|
||||
void PerformanceCounter::start() noexcept
|
||||
{
|
||||
startTime = Time::getHighResolutionTicks();
|
||||
}
|
||||
|
||||
bool PerformanceCounter::stop()
|
||||
{
|
||||
stats.addResult (Time::highResolutionTicksToSeconds (Time::getHighResolutionTicks() - startTime));
|
||||
|
||||
if (stats.numRuns < runsPerPrint)
|
||||
return false;
|
||||
|
||||
printStatistics();
|
||||
return true;
|
||||
}
|
||||
|
||||
void PerformanceCounter::printStatistics()
|
||||
{
|
||||
const String desc (getStatisticsAndReset().toString());
|
||||
|
||||
Logger::writeToLog (desc);
|
||||
appendToFile (outputFile, desc);
|
||||
}
|
||||
|
||||
PerformanceCounter::Statistics PerformanceCounter::getStatisticsAndReset()
|
||||
{
|
||||
Statistics s (stats);
|
||||
stats.clear();
|
||||
|
||||
if (s.numRuns > 0)
|
||||
s.averageSeconds = s.totalSeconds / (float) s.numRuns;
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
} // namespace juce
|
||||
|
@ -1,165 +1,165 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/** A timer for measuring performance of code and dumping the results to a file.
|
||||
|
||||
e.g. @code
|
||||
|
||||
PerformanceCounter pc ("fish", 50, "/temp/myfishlog.txt");
|
||||
|
||||
for (;;)
|
||||
{
|
||||
pc.start();
|
||||
|
||||
doSomethingFishy();
|
||||
|
||||
pc.stop();
|
||||
}
|
||||
@endcode
|
||||
|
||||
In this example, the time of each period between calling start/stop will be
|
||||
measured and averaged over 50 runs, and the results printed to a file
|
||||
every 50 times round the loop.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API PerformanceCounter
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a PerformanceCounter object.
|
||||
|
||||
@param counterName the name used when printing out the statistics
|
||||
@param runsPerPrintout the number of start/stop iterations before calling
|
||||
printStatistics()
|
||||
@param loggingFile a file to dump the results to - if this is File(),
|
||||
the results are just written to the debugger output
|
||||
*/
|
||||
PerformanceCounter (const String& counterName,
|
||||
int runsPerPrintout = 100,
|
||||
const File& loggingFile = File());
|
||||
|
||||
/** Destructor. */
|
||||
~PerformanceCounter();
|
||||
|
||||
//==============================================================================
|
||||
/** Starts timing.
|
||||
@see stop
|
||||
*/
|
||||
void start() noexcept;
|
||||
|
||||
/** Stops timing and prints out the results.
|
||||
|
||||
The number of iterations before doing a printout of the
|
||||
results is set in the constructor.
|
||||
|
||||
@see start
|
||||
*/
|
||||
bool stop();
|
||||
|
||||
/** Dumps the current metrics to the debugger output and to a file.
|
||||
|
||||
As well as using Logger::outputDebugString to print the results,
|
||||
this will write then to the file specified in the constructor (if
|
||||
this was valid).
|
||||
*/
|
||||
void printStatistics();
|
||||
|
||||
/** Holds the current statistics. */
|
||||
struct Statistics
|
||||
{
|
||||
Statistics() noexcept;
|
||||
|
||||
void clear() noexcept;
|
||||
String toString() const;
|
||||
|
||||
void addResult (double elapsed) noexcept;
|
||||
|
||||
String name;
|
||||
double averageSeconds;
|
||||
double maximumSeconds;
|
||||
double minimumSeconds;
|
||||
double totalSeconds;
|
||||
int64 numRuns;
|
||||
};
|
||||
|
||||
/** Returns a copy of the current stats, and resets the internal counter. */
|
||||
Statistics getStatisticsAndReset();
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
Statistics stats;
|
||||
int64 runsPerPrint, startTime;
|
||||
File outputFile;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PerformanceCounter)
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Simple RAII class for measuring the time spent in a scope.
|
||||
|
||||
Example:
|
||||
|
||||
{
|
||||
double timeSec;
|
||||
|
||||
{
|
||||
ScopedTimeMeasurement m (timeSec);
|
||||
doSomething();
|
||||
}
|
||||
|
||||
Logger::writeToLog ("doSomething() took " + String (timeSec) + "seconds");
|
||||
}
|
||||
|
||||
@param resultInSeconds The result of the measurement will be stored in this variable.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API ScopedTimeMeasurement
|
||||
{
|
||||
public:
|
||||
ScopedTimeMeasurement (double& resultInSeconds) noexcept
|
||||
: result (resultInSeconds)
|
||||
{
|
||||
result = 0.0;
|
||||
}
|
||||
|
||||
~ScopedTimeMeasurement()
|
||||
{
|
||||
static auto scaler = 1.0 / static_cast<double> (Time::getHighResolutionTicksPerSecond());
|
||||
result = static_cast<double> (Time::getHighResolutionTicks() - startTimeTicks) * scaler;
|
||||
}
|
||||
|
||||
private:
|
||||
int64 startTimeTicks = Time::getHighResolutionTicks();
|
||||
double& result;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedTimeMeasurement)
|
||||
};
|
||||
|
||||
} // namespace juce
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/** A timer for measuring performance of code and dumping the results to a file.
|
||||
|
||||
e.g. @code
|
||||
|
||||
PerformanceCounter pc ("fish", 50, "/temp/myfishlog.txt");
|
||||
|
||||
for (;;)
|
||||
{
|
||||
pc.start();
|
||||
|
||||
doSomethingFishy();
|
||||
|
||||
pc.stop();
|
||||
}
|
||||
@endcode
|
||||
|
||||
In this example, the time of each period between calling start/stop will be
|
||||
measured and averaged over 50 runs, and the results printed to a file
|
||||
every 50 times round the loop.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API PerformanceCounter
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a PerformanceCounter object.
|
||||
|
||||
@param counterName the name used when printing out the statistics
|
||||
@param runsPerPrintout the number of start/stop iterations before calling
|
||||
printStatistics()
|
||||
@param loggingFile a file to dump the results to - if this is File(),
|
||||
the results are just written to the debugger output
|
||||
*/
|
||||
PerformanceCounter (const String& counterName,
|
||||
int runsPerPrintout = 100,
|
||||
const File& loggingFile = File());
|
||||
|
||||
/** Destructor. */
|
||||
~PerformanceCounter();
|
||||
|
||||
//==============================================================================
|
||||
/** Starts timing.
|
||||
@see stop
|
||||
*/
|
||||
void start() noexcept;
|
||||
|
||||
/** Stops timing and prints out the results.
|
||||
|
||||
The number of iterations before doing a printout of the
|
||||
results is set in the constructor.
|
||||
|
||||
@see start
|
||||
*/
|
||||
bool stop();
|
||||
|
||||
/** Dumps the current metrics to the debugger output and to a file.
|
||||
|
||||
As well as using Logger::outputDebugString to print the results,
|
||||
this will write then to the file specified in the constructor (if
|
||||
this was valid).
|
||||
*/
|
||||
void printStatistics();
|
||||
|
||||
/** Holds the current statistics. */
|
||||
struct Statistics
|
||||
{
|
||||
Statistics() noexcept;
|
||||
|
||||
void clear() noexcept;
|
||||
String toString() const;
|
||||
|
||||
void addResult (double elapsed) noexcept;
|
||||
|
||||
String name;
|
||||
double averageSeconds;
|
||||
double maximumSeconds;
|
||||
double minimumSeconds;
|
||||
double totalSeconds;
|
||||
int64 numRuns;
|
||||
};
|
||||
|
||||
/** Returns a copy of the current stats, and resets the internal counter. */
|
||||
Statistics getStatisticsAndReset();
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
Statistics stats;
|
||||
int64 runsPerPrint, startTime;
|
||||
File outputFile;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PerformanceCounter)
|
||||
};
|
||||
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Simple RAII class for measuring the time spent in a scope.
|
||||
|
||||
Example:
|
||||
|
||||
{
|
||||
double timeSec;
|
||||
|
||||
{
|
||||
ScopedTimeMeasurement m (timeSec);
|
||||
doSomething();
|
||||
}
|
||||
|
||||
Logger::writeToLog ("doSomething() took " + String (timeSec) + "seconds");
|
||||
}
|
||||
|
||||
@param resultInSeconds The result of the measurement will be stored in this variable.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API ScopedTimeMeasurement
|
||||
{
|
||||
public:
|
||||
ScopedTimeMeasurement (double& resultInSeconds) noexcept
|
||||
: result (resultInSeconds)
|
||||
{
|
||||
result = 0.0;
|
||||
}
|
||||
|
||||
~ScopedTimeMeasurement()
|
||||
{
|
||||
static auto scaler = 1.0 / static_cast<double> (Time::getHighResolutionTicksPerSecond());
|
||||
result = static_cast<double> (Time::getHighResolutionTicks() - startTimeTicks) * scaler;
|
||||
}
|
||||
|
||||
private:
|
||||
int64 startTimeTicks = Time::getHighResolutionTicks();
|
||||
double& result;
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedTimeMeasurement)
|
||||
};
|
||||
|
||||
} // namespace juce
|
||||
|
@ -1,157 +1,157 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
RelativeTime::RelativeTime (const double secs) noexcept : numSeconds (secs) {}
|
||||
RelativeTime::RelativeTime (const RelativeTime& other) noexcept : numSeconds (other.numSeconds) {}
|
||||
RelativeTime::~RelativeTime() noexcept {}
|
||||
|
||||
//==============================================================================
|
||||
RelativeTime RelativeTime::milliseconds (int milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
|
||||
RelativeTime RelativeTime::milliseconds (int64 milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
|
||||
RelativeTime RelativeTime::seconds (double s) noexcept { return RelativeTime (s); }
|
||||
RelativeTime RelativeTime::minutes (double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); }
|
||||
RelativeTime RelativeTime::hours (double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); }
|
||||
RelativeTime RelativeTime::days (double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); }
|
||||
RelativeTime RelativeTime::weeks (double numberOfWeeks) noexcept { return RelativeTime (numberOfWeeks * (60.0 * 60.0 * 24.0 * 7.0)); }
|
||||
|
||||
//==============================================================================
|
||||
int64 RelativeTime::inMilliseconds() const noexcept { return (int64) (numSeconds * 1000.0); }
|
||||
double RelativeTime::inMinutes() const noexcept { return numSeconds / 60.0; }
|
||||
double RelativeTime::inHours() const noexcept { return numSeconds / (60.0 * 60.0); }
|
||||
double RelativeTime::inDays() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0); }
|
||||
double RelativeTime::inWeeks() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0 * 7.0); }
|
||||
|
||||
//==============================================================================
|
||||
RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept { numSeconds = other.numSeconds; return *this; }
|
||||
|
||||
RelativeTime RelativeTime::operator+= (RelativeTime t) noexcept { numSeconds += t.numSeconds; return *this; }
|
||||
RelativeTime RelativeTime::operator-= (RelativeTime t) noexcept { numSeconds -= t.numSeconds; return *this; }
|
||||
RelativeTime RelativeTime::operator+= (double secs) noexcept { numSeconds += secs; return *this; }
|
||||
RelativeTime RelativeTime::operator-= (double secs) noexcept { numSeconds -= secs; return *this; }
|
||||
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator+ (RelativeTime t1, RelativeTime t2) noexcept { return t1 += t2; }
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator- (RelativeTime t1, RelativeTime t2) noexcept { return t1 -= t2; }
|
||||
|
||||
JUCE_API bool JUCE_CALLTYPE operator== (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() == t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator!= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() != t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator> (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() > t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator< (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() < t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator>= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator<= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); }
|
||||
|
||||
//==============================================================================
|
||||
static String translateTimeField (int n, const char* singular, const char* plural)
|
||||
{
|
||||
return TRANS (n == 1 ? singular : plural).replace (n == 1 ? "1" : "2", String (n));
|
||||
}
|
||||
|
||||
static String describeYears (int n) { return translateTimeField (n, NEEDS_TRANS("1 year"), NEEDS_TRANS("2 years")); }
|
||||
static String describeMonths (int n) { return translateTimeField (n, NEEDS_TRANS("1 month"), NEEDS_TRANS("2 months")); }
|
||||
static String describeWeeks (int n) { return translateTimeField (n, NEEDS_TRANS("1 week"), NEEDS_TRANS("2 weeks")); }
|
||||
static String describeDays (int n) { return translateTimeField (n, NEEDS_TRANS("1 day"), NEEDS_TRANS("2 days")); }
|
||||
static String describeHours (int n) { return translateTimeField (n, NEEDS_TRANS("1 hr"), NEEDS_TRANS("2 hrs")); }
|
||||
static String describeMinutes (int n) { return translateTimeField (n, NEEDS_TRANS("1 min"), NEEDS_TRANS("2 mins")); }
|
||||
static String describeSeconds (int n) { return translateTimeField (n, NEEDS_TRANS("1 sec"), NEEDS_TRANS("2 secs")); }
|
||||
|
||||
String RelativeTime::getApproximateDescription() const
|
||||
{
|
||||
if (numSeconds <= 1.0)
|
||||
return "< 1 sec";
|
||||
|
||||
auto weeks = (int) inWeeks();
|
||||
|
||||
if (weeks > 52) return describeYears (weeks / 52);
|
||||
if (weeks > 8) return describeMonths ((weeks * 12) / 52);
|
||||
if (weeks > 1) return describeWeeks (weeks);
|
||||
|
||||
auto days = (int) inWeeks();
|
||||
|
||||
if (days > 1)
|
||||
return describeDays (days);
|
||||
|
||||
auto hours = (int) inHours();
|
||||
|
||||
if (hours > 0)
|
||||
return describeHours (hours);
|
||||
|
||||
auto minutes = (int) inMinutes();
|
||||
|
||||
if (minutes > 0)
|
||||
return describeMinutes (minutes);
|
||||
|
||||
return describeSeconds ((int) numSeconds);
|
||||
}
|
||||
|
||||
String RelativeTime::getDescription (const String& returnValueForZeroTime) const
|
||||
{
|
||||
if (std::abs (numSeconds) < 0.001)
|
||||
return returnValueForZeroTime;
|
||||
|
||||
if (numSeconds < 0)
|
||||
return "-" + RelativeTime (-numSeconds).getDescription();
|
||||
|
||||
StringArray fields;
|
||||
|
||||
auto n = (int) inWeeks();
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeWeeks (n));
|
||||
|
||||
n = ((int) inDays()) % 7;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeDays (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inHours()) % 24;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeHours (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inMinutes()) % 60;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeMinutes (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inSeconds()) % 60;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeSeconds (n));
|
||||
|
||||
if (fields.isEmpty())
|
||||
fields.add (String (((int) inMilliseconds()) % 1000) + " " + TRANS ("ms"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fields.joinIntoString (" ");
|
||||
}
|
||||
|
||||
} // namespace juce
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
RelativeTime::RelativeTime (const double secs) noexcept : numSeconds (secs) {}
|
||||
RelativeTime::RelativeTime (const RelativeTime& other) noexcept : numSeconds (other.numSeconds) {}
|
||||
RelativeTime::~RelativeTime() noexcept {}
|
||||
|
||||
//==============================================================================
|
||||
RelativeTime RelativeTime::milliseconds (int milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
|
||||
RelativeTime RelativeTime::milliseconds (int64 milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
|
||||
RelativeTime RelativeTime::seconds (double s) noexcept { return RelativeTime (s); }
|
||||
RelativeTime RelativeTime::minutes (double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); }
|
||||
RelativeTime RelativeTime::hours (double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); }
|
||||
RelativeTime RelativeTime::days (double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); }
|
||||
RelativeTime RelativeTime::weeks (double numberOfWeeks) noexcept { return RelativeTime (numberOfWeeks * (60.0 * 60.0 * 24.0 * 7.0)); }
|
||||
|
||||
//==============================================================================
|
||||
int64 RelativeTime::inMilliseconds() const noexcept { return (int64) (numSeconds * 1000.0); }
|
||||
double RelativeTime::inMinutes() const noexcept { return numSeconds / 60.0; }
|
||||
double RelativeTime::inHours() const noexcept { return numSeconds / (60.0 * 60.0); }
|
||||
double RelativeTime::inDays() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0); }
|
||||
double RelativeTime::inWeeks() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0 * 7.0); }
|
||||
|
||||
//==============================================================================
|
||||
RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept { numSeconds = other.numSeconds; return *this; }
|
||||
|
||||
RelativeTime RelativeTime::operator+= (RelativeTime t) noexcept { numSeconds += t.numSeconds; return *this; }
|
||||
RelativeTime RelativeTime::operator-= (RelativeTime t) noexcept { numSeconds -= t.numSeconds; return *this; }
|
||||
RelativeTime RelativeTime::operator+= (double secs) noexcept { numSeconds += secs; return *this; }
|
||||
RelativeTime RelativeTime::operator-= (double secs) noexcept { numSeconds -= secs; return *this; }
|
||||
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator+ (RelativeTime t1, RelativeTime t2) noexcept { return t1 += t2; }
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator- (RelativeTime t1, RelativeTime t2) noexcept { return t1 -= t2; }
|
||||
|
||||
JUCE_API bool JUCE_CALLTYPE operator== (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() == t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator!= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() != t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator> (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() > t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator< (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() < t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator>= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); }
|
||||
JUCE_API bool JUCE_CALLTYPE operator<= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); }
|
||||
|
||||
//==============================================================================
|
||||
static String translateTimeField (int n, const char* singular, const char* plural)
|
||||
{
|
||||
return TRANS (n == 1 ? singular : plural).replace (n == 1 ? "1" : "2", String (n));
|
||||
}
|
||||
|
||||
static String describeYears (int n) { return translateTimeField (n, NEEDS_TRANS("1 year"), NEEDS_TRANS("2 years")); }
|
||||
static String describeMonths (int n) { return translateTimeField (n, NEEDS_TRANS("1 month"), NEEDS_TRANS("2 months")); }
|
||||
static String describeWeeks (int n) { return translateTimeField (n, NEEDS_TRANS("1 week"), NEEDS_TRANS("2 weeks")); }
|
||||
static String describeDays (int n) { return translateTimeField (n, NEEDS_TRANS("1 day"), NEEDS_TRANS("2 days")); }
|
||||
static String describeHours (int n) { return translateTimeField (n, NEEDS_TRANS("1 hr"), NEEDS_TRANS("2 hrs")); }
|
||||
static String describeMinutes (int n) { return translateTimeField (n, NEEDS_TRANS("1 min"), NEEDS_TRANS("2 mins")); }
|
||||
static String describeSeconds (int n) { return translateTimeField (n, NEEDS_TRANS("1 sec"), NEEDS_TRANS("2 secs")); }
|
||||
|
||||
String RelativeTime::getApproximateDescription() const
|
||||
{
|
||||
if (numSeconds <= 1.0)
|
||||
return "< 1 sec";
|
||||
|
||||
auto weeks = (int) inWeeks();
|
||||
|
||||
if (weeks > 52) return describeYears (weeks / 52);
|
||||
if (weeks > 8) return describeMonths ((weeks * 12) / 52);
|
||||
if (weeks > 1) return describeWeeks (weeks);
|
||||
|
||||
auto days = (int) inWeeks();
|
||||
|
||||
if (days > 1)
|
||||
return describeDays (days);
|
||||
|
||||
auto hours = (int) inHours();
|
||||
|
||||
if (hours > 0)
|
||||
return describeHours (hours);
|
||||
|
||||
auto minutes = (int) inMinutes();
|
||||
|
||||
if (minutes > 0)
|
||||
return describeMinutes (minutes);
|
||||
|
||||
return describeSeconds ((int) numSeconds);
|
||||
}
|
||||
|
||||
String RelativeTime::getDescription (const String& returnValueForZeroTime) const
|
||||
{
|
||||
if (std::abs (numSeconds) < 0.001)
|
||||
return returnValueForZeroTime;
|
||||
|
||||
if (numSeconds < 0)
|
||||
return "-" + RelativeTime (-numSeconds).getDescription();
|
||||
|
||||
StringArray fields;
|
||||
|
||||
auto n = (int) inWeeks();
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeWeeks (n));
|
||||
|
||||
n = ((int) inDays()) % 7;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeDays (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inHours()) % 24;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeHours (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inMinutes()) % 60;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeMinutes (n));
|
||||
|
||||
if (fields.size() < 2)
|
||||
{
|
||||
n = ((int) inSeconds()) % 60;
|
||||
|
||||
if (n > 0)
|
||||
fields.add (describeSeconds (n));
|
||||
|
||||
if (fields.isEmpty())
|
||||
fields.add (String (((int) inMilliseconds()) % 1000) + " " + TRANS ("ms"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fields.joinIntoString (" ");
|
||||
}
|
||||
|
||||
} // namespace juce
|
||||
|
368
deps/juce/modules/juce_core/time/juce_RelativeTime.h
vendored
368
deps/juce/modules/juce_core/time/juce_RelativeTime.h
vendored
@ -1,184 +1,184 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/** A relative measure of time.
|
||||
|
||||
The time is stored as a number of seconds, at double-precision floating
|
||||
point accuracy, and may be positive or negative.
|
||||
|
||||
If you need an absolute time, (i.e. a date + time), see the Time class.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API RelativeTime
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a RelativeTime.
|
||||
|
||||
@param seconds the number of seconds, which may be +ve or -ve.
|
||||
@see milliseconds, minutes, hours, days, weeks
|
||||
*/
|
||||
explicit RelativeTime (double seconds = 0.0) noexcept;
|
||||
|
||||
/** Copies another relative time. */
|
||||
RelativeTime (const RelativeTime& other) noexcept;
|
||||
|
||||
/** Copies another relative time. */
|
||||
RelativeTime& operator= (const RelativeTime& other) noexcept;
|
||||
|
||||
/** Destructor. */
|
||||
~RelativeTime() noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Creates a new RelativeTime object representing a number of milliseconds.
|
||||
@see seconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime milliseconds (int milliseconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of milliseconds.
|
||||
@see seconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime milliseconds (int64 milliseconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of seconds.
|
||||
@see milliseconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime seconds (double seconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of minutes.
|
||||
@see milliseconds, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime minutes (double numberOfMinutes) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of hours.
|
||||
@see milliseconds, minutes, days, weeks
|
||||
*/
|
||||
static RelativeTime hours (double numberOfHours) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of days.
|
||||
@see milliseconds, minutes, hours, weeks
|
||||
*/
|
||||
static RelativeTime days (double numberOfDays) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of weeks.
|
||||
@see milliseconds, minutes, hours, days
|
||||
*/
|
||||
static RelativeTime weeks (double numberOfWeeks) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the number of milliseconds this time represents.
|
||||
@see milliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
int64 inMilliseconds() const noexcept;
|
||||
|
||||
/** Returns the number of seconds this time represents.
|
||||
@see inMilliseconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
double inSeconds() const noexcept { return numSeconds; }
|
||||
|
||||
/** Returns the number of minutes this time represents.
|
||||
@see inMilliseconds, inSeconds, inHours, inDays, inWeeks
|
||||
*/
|
||||
double inMinutes() const noexcept;
|
||||
|
||||
/** Returns the number of hours this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inDays, inWeeks
|
||||
*/
|
||||
double inHours() const noexcept;
|
||||
|
||||
/** Returns the number of days this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inWeeks
|
||||
*/
|
||||
double inDays() const noexcept;
|
||||
|
||||
/** Returns the number of weeks this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inDays
|
||||
*/
|
||||
double inWeeks() const noexcept;
|
||||
|
||||
/** Returns a readable textual description of the time.
|
||||
|
||||
The exact format of the string returned will depend on
|
||||
the magnitude of the time - e.g.
|
||||
|
||||
"1 min 4 secs", "1 hr 45 mins", "2 weeks 5 days", "140 ms"
|
||||
|
||||
so that only the two most significant units are printed.
|
||||
|
||||
The returnValueForZeroTime value is the result that is returned if the
|
||||
length is zero. Depending on your application you might want to use this
|
||||
to return something more relevant like "empty" or "0 secs", etc.
|
||||
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
String getDescription (const String& returnValueForZeroTime = "0") const;
|
||||
|
||||
//==============================================================================
|
||||
/** This returns a string that roughly describes how long ago this time was, which
|
||||
can be handy for showing ages of files, etc.
|
||||
This will only attempt to be accurate to within the nearest order of magnitude
|
||||
so returns strings such as "5 years", "2 weeks", "< 1 minute", "< 1 sec" etc.
|
||||
*/
|
||||
String getApproximateDescription() const;
|
||||
|
||||
//==============================================================================
|
||||
/** Adds another RelativeTime to this one. */
|
||||
RelativeTime operator+= (RelativeTime timeToAdd) noexcept;
|
||||
/** Subtracts another RelativeTime from this one. */
|
||||
RelativeTime operator-= (RelativeTime timeToSubtract) noexcept;
|
||||
|
||||
/** Adds a number of seconds to this time. */
|
||||
RelativeTime operator+= (double secondsToAdd) noexcept;
|
||||
/** Subtracts a number of seconds from this time. */
|
||||
RelativeTime operator-= (double secondsToSubtract) noexcept;
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
double numSeconds;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator== (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator!= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator> (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator< (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator>= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator<= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Adds two RelativeTimes together. */
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator+ (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Subtracts two RelativeTimes. */
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator- (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
|
||||
} // namespace juce
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/** A relative measure of time.
|
||||
|
||||
The time is stored as a number of seconds, at double-precision floating
|
||||
point accuracy, and may be positive or negative.
|
||||
|
||||
If you need an absolute time, (i.e. a date + time), see the Time class.
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API RelativeTime
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a RelativeTime.
|
||||
|
||||
@param seconds the number of seconds, which may be +ve or -ve.
|
||||
@see milliseconds, minutes, hours, days, weeks
|
||||
*/
|
||||
explicit RelativeTime (double seconds = 0.0) noexcept;
|
||||
|
||||
/** Copies another relative time. */
|
||||
RelativeTime (const RelativeTime& other) noexcept;
|
||||
|
||||
/** Copies another relative time. */
|
||||
RelativeTime& operator= (const RelativeTime& other) noexcept;
|
||||
|
||||
/** Destructor. */
|
||||
~RelativeTime() noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Creates a new RelativeTime object representing a number of milliseconds.
|
||||
@see seconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime milliseconds (int milliseconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of milliseconds.
|
||||
@see seconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime milliseconds (int64 milliseconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of seconds.
|
||||
@see milliseconds, minutes, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime seconds (double seconds) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of minutes.
|
||||
@see milliseconds, hours, days, weeks
|
||||
*/
|
||||
static RelativeTime minutes (double numberOfMinutes) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of hours.
|
||||
@see milliseconds, minutes, days, weeks
|
||||
*/
|
||||
static RelativeTime hours (double numberOfHours) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of days.
|
||||
@see milliseconds, minutes, hours, weeks
|
||||
*/
|
||||
static RelativeTime days (double numberOfDays) noexcept;
|
||||
|
||||
/** Creates a new RelativeTime object representing a number of weeks.
|
||||
@see milliseconds, minutes, hours, days
|
||||
*/
|
||||
static RelativeTime weeks (double numberOfWeeks) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the number of milliseconds this time represents.
|
||||
@see milliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
int64 inMilliseconds() const noexcept;
|
||||
|
||||
/** Returns the number of seconds this time represents.
|
||||
@see inMilliseconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
double inSeconds() const noexcept { return numSeconds; }
|
||||
|
||||
/** Returns the number of minutes this time represents.
|
||||
@see inMilliseconds, inSeconds, inHours, inDays, inWeeks
|
||||
*/
|
||||
double inMinutes() const noexcept;
|
||||
|
||||
/** Returns the number of hours this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inDays, inWeeks
|
||||
*/
|
||||
double inHours() const noexcept;
|
||||
|
||||
/** Returns the number of days this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inWeeks
|
||||
*/
|
||||
double inDays() const noexcept;
|
||||
|
||||
/** Returns the number of weeks this time represents.
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inDays
|
||||
*/
|
||||
double inWeeks() const noexcept;
|
||||
|
||||
/** Returns a readable textual description of the time.
|
||||
|
||||
The exact format of the string returned will depend on
|
||||
the magnitude of the time - e.g.
|
||||
|
||||
"1 min 4 secs", "1 hr 45 mins", "2 weeks 5 days", "140 ms"
|
||||
|
||||
so that only the two most significant units are printed.
|
||||
|
||||
The returnValueForZeroTime value is the result that is returned if the
|
||||
length is zero. Depending on your application you might want to use this
|
||||
to return something more relevant like "empty" or "0 secs", etc.
|
||||
|
||||
@see inMilliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks
|
||||
*/
|
||||
String getDescription (const String& returnValueForZeroTime = "0") const;
|
||||
|
||||
//==============================================================================
|
||||
/** This returns a string that roughly describes how long ago this time was, which
|
||||
can be handy for showing ages of files, etc.
|
||||
This will only attempt to be accurate to within the nearest order of magnitude
|
||||
so returns strings such as "5 years", "2 weeks", "< 1 minute", "< 1 sec" etc.
|
||||
*/
|
||||
String getApproximateDescription() const;
|
||||
|
||||
//==============================================================================
|
||||
/** Adds another RelativeTime to this one. */
|
||||
RelativeTime operator+= (RelativeTime timeToAdd) noexcept;
|
||||
/** Subtracts another RelativeTime from this one. */
|
||||
RelativeTime operator-= (RelativeTime timeToSubtract) noexcept;
|
||||
|
||||
/** Adds a number of seconds to this time. */
|
||||
RelativeTime operator+= (double secondsToAdd) noexcept;
|
||||
/** Subtracts a number of seconds from this time. */
|
||||
RelativeTime operator-= (double secondsToSubtract) noexcept;
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
double numSeconds;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator== (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator!= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator> (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator< (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator>= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Compares two RelativeTimes. */
|
||||
JUCE_API bool JUCE_CALLTYPE operator<= (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Adds two RelativeTimes together. */
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator+ (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
/** Subtracts two RelativeTimes. */
|
||||
JUCE_API RelativeTime JUCE_CALLTYPE operator- (RelativeTime t1, RelativeTime t2) noexcept;
|
||||
|
||||
} // namespace juce
|
||||
|
1359
deps/juce/modules/juce_core/time/juce_Time.cpp
vendored
1359
deps/juce/modules/juce_core/time/juce_Time.cpp
vendored
File diff suppressed because it is too large
Load Diff
802
deps/juce/modules/juce_core/time/juce_Time.h
vendored
802
deps/juce/modules/juce_core/time/juce_Time.h
vendored
@ -1,401 +1,401 @@
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2020 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Holds an absolute date and time.
|
||||
|
||||
Internally, the time is stored at millisecond precision.
|
||||
|
||||
@see RelativeTime
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API Time
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a Time object.
|
||||
This default constructor creates a time of midnight Jan 1st 1970 UTC, (which is
|
||||
represented internally as 0ms).
|
||||
To create a time object representing the current time, use getCurrentTime().
|
||||
@see getCurrentTime
|
||||
*/
|
||||
Time() = default;
|
||||
|
||||
/** Creates a time based on a number of milliseconds.
|
||||
To create a time object set to the current time, use getCurrentTime().
|
||||
|
||||
@param millisecondsSinceEpoch the number of milliseconds since the unix
|
||||
'epoch' (midnight Jan 1st 1970 UTC).
|
||||
@see getCurrentTime, currentTimeMillis
|
||||
*/
|
||||
explicit Time (int64 millisecondsSinceEpoch) noexcept;
|
||||
|
||||
/** Creates a time from a set of date components.
|
||||
|
||||
@param year the year, in 4-digit format, e.g. 2004
|
||||
@param month the month, in the range 0 to 11
|
||||
@param day the day of the month, in the range 1 to 31
|
||||
@param hours hours in 24-hour clock format, 0 to 23
|
||||
@param minutes minutes 0 to 59
|
||||
@param seconds seconds 0 to 59
|
||||
@param milliseconds milliseconds 0 to 999
|
||||
@param useLocalTime if true, assume input is in this machine's local timezone
|
||||
if false, assume input is in UTC.
|
||||
*/
|
||||
Time (int year,
|
||||
int month,
|
||||
int day,
|
||||
int hours,
|
||||
int minutes,
|
||||
int seconds = 0,
|
||||
int milliseconds = 0,
|
||||
bool useLocalTime = true) noexcept;
|
||||
|
||||
Time (const Time&) = default;
|
||||
~Time() = default;
|
||||
|
||||
Time& operator= (const Time&) = default;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a Time object that is set to the current system time.
|
||||
|
||||
This may not be monotonic, as the system time can change at any moment.
|
||||
You should therefore not use this method for measuring time intervals.
|
||||
|
||||
@see currentTimeMillis
|
||||
*/
|
||||
static Time JUCE_CALLTYPE getCurrentTime() noexcept;
|
||||
|
||||
/** Returns the time as a number of milliseconds.
|
||||
@returns the number of milliseconds this Time object represents, since
|
||||
midnight Jan 1st 1970 UTC.
|
||||
@see getMilliseconds
|
||||
*/
|
||||
int64 toMilliseconds() const noexcept { return millisSinceEpoch; }
|
||||
|
||||
/** Returns the year (in this machine's local timezone).
|
||||
A 4-digit format is used, e.g. 2004.
|
||||
*/
|
||||
int getYear() const noexcept;
|
||||
|
||||
/** Returns the number of the month (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 11.
|
||||
@see getMonthName
|
||||
*/
|
||||
int getMonth() const noexcept;
|
||||
|
||||
/** Returns the name of the month (in this machine's local timezone).
|
||||
@param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false
|
||||
it'll return the long form, e.g. "January"
|
||||
@see getMonth
|
||||
*/
|
||||
String getMonthName (bool threeLetterVersion) const;
|
||||
|
||||
/** Returns the day of the month (in this machine's local timezone).
|
||||
The value returned is in the range 1 to 31.
|
||||
*/
|
||||
int getDayOfMonth() const noexcept;
|
||||
|
||||
/** Returns the number of the day of the week (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc).
|
||||
*/
|
||||
int getDayOfWeek() const noexcept;
|
||||
|
||||
/** Returns the number of the day of the year (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 365.
|
||||
*/
|
||||
int getDayOfYear() const noexcept;
|
||||
|
||||
/** Returns the name of the weekday (in this machine's local timezone).
|
||||
@param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if
|
||||
false, it'll return the full version, e.g. "Tuesday".
|
||||
*/
|
||||
String getWeekdayName (bool threeLetterVersion) const;
|
||||
|
||||
/** Returns the number of hours since midnight (in this machine's local timezone).
|
||||
This is in 24-hour clock format, in the range 0 to 23.
|
||||
@see getHoursInAmPmFormat, isAfternoon
|
||||
*/
|
||||
int getHours() const noexcept;
|
||||
|
||||
/** Returns true if the time is in the afternoon (in this machine's local timezone).
|
||||
@returns true for "PM", false for "AM".
|
||||
@see getHoursInAmPmFormat, getHours
|
||||
*/
|
||||
bool isAfternoon() const noexcept;
|
||||
|
||||
/** Returns the hours in 12-hour clock format (in this machine's local timezone).
|
||||
This will return a value 1 to 12 - use isAfternoon() to find out
|
||||
whether this is in the afternoon or morning.
|
||||
@see getHours, isAfternoon
|
||||
*/
|
||||
int getHoursInAmPmFormat() const noexcept;
|
||||
|
||||
/** Returns the number of minutes, 0 to 59 (in this machine's local timezone). */
|
||||
int getMinutes() const noexcept;
|
||||
|
||||
/** Returns the number of seconds, 0 to 59. */
|
||||
int getSeconds() const noexcept;
|
||||
|
||||
/** Returns the number of milliseconds, 0 to 999.
|
||||
|
||||
Unlike toMilliseconds(), this just returns the position within the
|
||||
current second rather than the total number since the epoch.
|
||||
|
||||
@see toMilliseconds
|
||||
*/
|
||||
int getMilliseconds() const noexcept;
|
||||
|
||||
/** Returns true if the local timezone uses a daylight saving correction. */
|
||||
bool isDaylightSavingTime() const noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a 3-character string to indicate the local timezone. */
|
||||
String getTimeZone() const;
|
||||
|
||||
/** Returns the local timezone offset from UTC in seconds. */
|
||||
int getUTCOffsetSeconds() const noexcept;
|
||||
|
||||
/** Returns a string to indicate the offset of the local timezone from UTC.
|
||||
@returns "+XX:XX", "-XX:XX" or "Z"
|
||||
@param includeDividerCharacters whether to include or omit the ":" divider in the string
|
||||
*/
|
||||
String getUTCOffsetString (bool includeDividerCharacters) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a string version of this date and time, using this machine's local timezone.
|
||||
|
||||
For a more powerful way of formatting the date and time, see the formatted() method.
|
||||
|
||||
@param includeDate whether to include the date in the string
|
||||
@param includeTime whether to include the time in the string
|
||||
@param includeSeconds if the time is being included, this provides an option not to include
|
||||
the seconds in it
|
||||
@param use24HourClock if the time is being included, sets whether to use am/pm or 24
|
||||
hour notation.
|
||||
@see formatted
|
||||
*/
|
||||
String toString (bool includeDate,
|
||||
bool includeTime,
|
||||
bool includeSeconds = true,
|
||||
bool use24HourClock = false) const;
|
||||
|
||||
/** Converts this date/time to a string with a user-defined format.
|
||||
|
||||
This uses the C strftime() function to format this time as a string. To save you
|
||||
looking it up, these are the escape codes that strftime uses (other codes might
|
||||
work on some platforms and not others, but these are the common ones):
|
||||
|
||||
- %a is replaced by the locale's abbreviated weekday name.
|
||||
- %A is replaced by the locale's full weekday name.
|
||||
- %b is replaced by the locale's abbreviated month name.
|
||||
- %B is replaced by the locale's full month name.
|
||||
- %c is replaced by the locale's appropriate date and time representation.
|
||||
- %d is replaced by the day of the month as a decimal number [01,31].
|
||||
- %H is replaced by the hour (24-hour clock) as a decimal number [00,23].
|
||||
- %I is replaced by the hour (12-hour clock) as a decimal number [01,12].
|
||||
- %j is replaced by the day of the year as a decimal number [001,366].
|
||||
- %m is replaced by the month as a decimal number [01,12].
|
||||
- %M is replaced by the minute as a decimal number [00,59].
|
||||
- %p is replaced by the locale's equivalent of either a.m. or p.m.
|
||||
- %S is replaced by the second as a decimal number [00,60].
|
||||
- %U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
|
||||
- %w is replaced by the weekday as a decimal number [0,6], with 0 representing Sunday.
|
||||
- %W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.
|
||||
- %x is replaced by the locale's appropriate date representation.
|
||||
- %X is replaced by the locale's appropriate time representation.
|
||||
- %y is replaced by the year without century as a decimal number [00,99].
|
||||
- %Y is replaced by the year with century as a decimal number.
|
||||
- %Z is replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists.
|
||||
- %% is replaced by %.
|
||||
|
||||
@see toString
|
||||
*/
|
||||
String formatted (const String& format) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a fully described string of this date and time in ISO-8601 format
|
||||
(using the local timezone).
|
||||
|
||||
@param includeDividerCharacters whether to include or omit the "-" and ":"
|
||||
dividers in the string
|
||||
*/
|
||||
String toISO8601 (bool includeDividerCharacters) const;
|
||||
|
||||
/** Parses an ISO-8601 string and returns it as a Time. */
|
||||
static Time fromISO8601 (StringRef iso8601);
|
||||
|
||||
//==============================================================================
|
||||
/** Adds a RelativeTime to this time. */
|
||||
Time& operator+= (RelativeTime delta) noexcept;
|
||||
/** Subtracts a RelativeTime from this time. */
|
||||
Time& operator-= (RelativeTime delta) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Tries to set the computer's clock.
|
||||
|
||||
@returns true if this succeeds, although depending on the system, the
|
||||
application might not have sufficient privileges to do this.
|
||||
*/
|
||||
bool setSystemTimeToThisTime() const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the name of a day of the week.
|
||||
|
||||
@param dayNumber the day, 0 to 6 (0 = sunday, 1 = monday, etc)
|
||||
@param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if
|
||||
false, it'll return the full version, e.g. "Tuesday".
|
||||
*/
|
||||
static String getWeekdayName (int dayNumber, bool threeLetterVersion);
|
||||
|
||||
/** Returns the name of one of the months.
|
||||
|
||||
@param monthNumber the month, 0 to 11
|
||||
@param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false
|
||||
it'll return the long form, e.g. "January"
|
||||
*/
|
||||
static String getMonthName (int monthNumber, bool threeLetterVersion);
|
||||
|
||||
//==============================================================================
|
||||
// Static methods for getting system timers directly..
|
||||
|
||||
/** Returns the current system time.
|
||||
|
||||
Returns the number of milliseconds since midnight Jan 1st 1970 UTC.
|
||||
|
||||
Should be accurate to within a few millisecs, depending on platform,
|
||||
hardware, etc.
|
||||
*/
|
||||
static int64 currentTimeMillis() noexcept;
|
||||
|
||||
/** Returns the number of millisecs since a fixed event (usually system startup).
|
||||
|
||||
This returns a monotonically increasing value which is unaffected by changes to the
|
||||
system clock. It should be accurate to within a few millisecs, depending on platform,
|
||||
hardware, etc.
|
||||
|
||||
Being a 32-bit return value, it will of course wrap back to 0 after 2^32 seconds of
|
||||
uptime, so be careful to take that into account. If you need a 64-bit time, you can
|
||||
use currentTimeMillis() instead.
|
||||
|
||||
@see getApproximateMillisecondCounter
|
||||
*/
|
||||
static uint32 getMillisecondCounter() noexcept;
|
||||
|
||||
/** Returns the number of millisecs since a fixed event (usually system startup).
|
||||
|
||||
This has the same function as getMillisecondCounter(), but returns a more accurate
|
||||
value, using a higher-resolution timer if one is available.
|
||||
|
||||
@see getMillisecondCounter
|
||||
*/
|
||||
static double getMillisecondCounterHiRes() noexcept;
|
||||
|
||||
/** Waits until the getMillisecondCounter() reaches a given value.
|
||||
|
||||
This will make the thread sleep as efficiently as it can while it's waiting.
|
||||
*/
|
||||
static void waitForMillisecondCounter (uint32 targetTime) noexcept;
|
||||
|
||||
/** Less-accurate but faster version of getMillisecondCounter().
|
||||
|
||||
This will return the last value that getMillisecondCounter() returned, so doesn't
|
||||
need to make a system call, but is less accurate - it shouldn't be more than
|
||||
100ms away from the correct time, though, so is still accurate enough for a
|
||||
lot of purposes.
|
||||
|
||||
@see getMillisecondCounter
|
||||
*/
|
||||
static uint32 getApproximateMillisecondCounter() noexcept;
|
||||
|
||||
//==============================================================================
|
||||
// High-resolution timers..
|
||||
|
||||
/** Returns the current high-resolution counter's tick-count.
|
||||
|
||||
This is a similar idea to getMillisecondCounter(), but with a higher
|
||||
resolution.
|
||||
|
||||
@see getHighResolutionTicksPerSecond, highResolutionTicksToSeconds,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static int64 getHighResolutionTicks() noexcept;
|
||||
|
||||
/** Returns the resolution of the high-resolution counter in ticks per second.
|
||||
|
||||
@see getHighResolutionTicks, highResolutionTicksToSeconds,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static int64 getHighResolutionTicksPerSecond() noexcept;
|
||||
|
||||
/** Converts a number of high-resolution ticks into seconds.
|
||||
|
||||
@see getHighResolutionTicks, getHighResolutionTicksPerSecond,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static double highResolutionTicksToSeconds (int64 ticks) noexcept;
|
||||
|
||||
/** Converts a number seconds into high-resolution ticks.
|
||||
|
||||
@see getHighResolutionTicks, getHighResolutionTicksPerSecond,
|
||||
highResolutionTicksToSeconds
|
||||
*/
|
||||
static int64 secondsToHighResolutionTicks (double seconds) noexcept;
|
||||
|
||||
/** Returns a Time based on the value of the __DATE__ macro when this module was compiled */
|
||||
static Time getCompilationDate();
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
int64 millisSinceEpoch = 0;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Adds a RelativeTime to a Time. */
|
||||
JUCE_API Time operator+ (Time time, RelativeTime delta) noexcept;
|
||||
/** Adds a RelativeTime to a Time. */
|
||||
JUCE_API Time operator+ (RelativeTime delta, Time time) noexcept;
|
||||
|
||||
/** Subtracts a RelativeTime from a Time. */
|
||||
JUCE_API Time operator- (Time time, RelativeTime delta) noexcept;
|
||||
/** Returns the relative time difference between two times. */
|
||||
JUCE_API const RelativeTime operator- (Time time1, Time time2) noexcept;
|
||||
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator== (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator!= (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator< (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator<= (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator> (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator>= (Time time1, Time time2) noexcept;
|
||||
|
||||
} // namespace juce
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library.
|
||||
Copyright (c) 2022 - Raw Material Software Limited
|
||||
|
||||
JUCE is an open source library subject to commercial or open-source
|
||||
licensing.
|
||||
|
||||
The code included in this file is provided under the terms of the ISC license
|
||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission
|
||||
To use, copy, modify, and/or distribute this software for any purpose with or
|
||||
without fee is hereby granted provided that the above copyright notice and
|
||||
this permission notice appear in all copies.
|
||||
|
||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
|
||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
|
||||
DISCLAIMED.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
namespace juce
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/**
|
||||
Holds an absolute date and time.
|
||||
|
||||
Internally, the time is stored at millisecond precision.
|
||||
|
||||
@see RelativeTime
|
||||
|
||||
@tags{Core}
|
||||
*/
|
||||
class JUCE_API Time
|
||||
{
|
||||
public:
|
||||
//==============================================================================
|
||||
/** Creates a Time object.
|
||||
This default constructor creates a time of midnight Jan 1st 1970 UTC, (which is
|
||||
represented internally as 0ms).
|
||||
To create a time object representing the current time, use getCurrentTime().
|
||||
@see getCurrentTime
|
||||
*/
|
||||
Time() = default;
|
||||
|
||||
/** Creates a time based on a number of milliseconds.
|
||||
To create a time object set to the current time, use getCurrentTime().
|
||||
|
||||
@param millisecondsSinceEpoch the number of milliseconds since the unix
|
||||
'epoch' (midnight Jan 1st 1970 UTC).
|
||||
@see getCurrentTime, currentTimeMillis
|
||||
*/
|
||||
explicit Time (int64 millisecondsSinceEpoch) noexcept;
|
||||
|
||||
/** Creates a time from a set of date components.
|
||||
|
||||
@param year the year, in 4-digit format, e.g. 2004
|
||||
@param month the month, in the range 0 to 11
|
||||
@param day the day of the month, in the range 1 to 31
|
||||
@param hours hours in 24-hour clock format, 0 to 23
|
||||
@param minutes minutes 0 to 59
|
||||
@param seconds seconds 0 to 59
|
||||
@param milliseconds milliseconds 0 to 999
|
||||
@param useLocalTime if true, assume input is in this machine's local timezone
|
||||
if false, assume input is in UTC.
|
||||
*/
|
||||
Time (int year,
|
||||
int month,
|
||||
int day,
|
||||
int hours,
|
||||
int minutes,
|
||||
int seconds = 0,
|
||||
int milliseconds = 0,
|
||||
bool useLocalTime = true) noexcept;
|
||||
|
||||
Time (const Time&) = default;
|
||||
~Time() = default;
|
||||
|
||||
Time& operator= (const Time&) = default;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a Time object that is set to the current system time.
|
||||
|
||||
This may not be monotonic, as the system time can change at any moment.
|
||||
You should therefore not use this method for measuring time intervals.
|
||||
|
||||
@see currentTimeMillis
|
||||
*/
|
||||
static Time JUCE_CALLTYPE getCurrentTime() noexcept;
|
||||
|
||||
/** Returns the time as a number of milliseconds.
|
||||
@returns the number of milliseconds this Time object represents, since
|
||||
midnight Jan 1st 1970 UTC.
|
||||
@see getMilliseconds
|
||||
*/
|
||||
int64 toMilliseconds() const noexcept { return millisSinceEpoch; }
|
||||
|
||||
/** Returns the year (in this machine's local timezone).
|
||||
A 4-digit format is used, e.g. 2004.
|
||||
*/
|
||||
int getYear() const noexcept;
|
||||
|
||||
/** Returns the number of the month (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 11.
|
||||
@see getMonthName
|
||||
*/
|
||||
int getMonth() const noexcept;
|
||||
|
||||
/** Returns the name of the month (in this machine's local timezone).
|
||||
@param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false
|
||||
it'll return the long form, e.g. "January"
|
||||
@see getMonth
|
||||
*/
|
||||
String getMonthName (bool threeLetterVersion) const;
|
||||
|
||||
/** Returns the day of the month (in this machine's local timezone).
|
||||
The value returned is in the range 1 to 31.
|
||||
*/
|
||||
int getDayOfMonth() const noexcept;
|
||||
|
||||
/** Returns the number of the day of the week (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc).
|
||||
*/
|
||||
int getDayOfWeek() const noexcept;
|
||||
|
||||
/** Returns the number of the day of the year (in this machine's local timezone).
|
||||
The value returned is in the range 0 to 365.
|
||||
*/
|
||||
int getDayOfYear() const noexcept;
|
||||
|
||||
/** Returns the name of the weekday (in this machine's local timezone).
|
||||
@param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if
|
||||
false, it'll return the full version, e.g. "Tuesday".
|
||||
*/
|
||||
String getWeekdayName (bool threeLetterVersion) const;
|
||||
|
||||
/** Returns the number of hours since midnight (in this machine's local timezone).
|
||||
This is in 24-hour clock format, in the range 0 to 23.
|
||||
@see getHoursInAmPmFormat, isAfternoon
|
||||
*/
|
||||
int getHours() const noexcept;
|
||||
|
||||
/** Returns true if the time is in the afternoon (in this machine's local timezone).
|
||||
@returns true for "PM", false for "AM".
|
||||
@see getHoursInAmPmFormat, getHours
|
||||
*/
|
||||
bool isAfternoon() const noexcept;
|
||||
|
||||
/** Returns the hours in 12-hour clock format (in this machine's local timezone).
|
||||
This will return a value 1 to 12 - use isAfternoon() to find out
|
||||
whether this is in the afternoon or morning.
|
||||
@see getHours, isAfternoon
|
||||
*/
|
||||
int getHoursInAmPmFormat() const noexcept;
|
||||
|
||||
/** Returns the number of minutes, 0 to 59 (in this machine's local timezone). */
|
||||
int getMinutes() const noexcept;
|
||||
|
||||
/** Returns the number of seconds, 0 to 59. */
|
||||
int getSeconds() const noexcept;
|
||||
|
||||
/** Returns the number of milliseconds, 0 to 999.
|
||||
|
||||
Unlike toMilliseconds(), this just returns the position within the
|
||||
current second rather than the total number since the epoch.
|
||||
|
||||
@see toMilliseconds
|
||||
*/
|
||||
int getMilliseconds() const noexcept;
|
||||
|
||||
/** Returns true if the local timezone uses a daylight saving correction. */
|
||||
bool isDaylightSavingTime() const noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a 3-character string to indicate the local timezone. */
|
||||
String getTimeZone() const;
|
||||
|
||||
/** Returns the local timezone offset from UTC in seconds. */
|
||||
int getUTCOffsetSeconds() const noexcept;
|
||||
|
||||
/** Returns a string to indicate the offset of the local timezone from UTC.
|
||||
@returns "+XX:XX", "-XX:XX" or "Z"
|
||||
@param includeDividerCharacters whether to include or omit the ":" divider in the string
|
||||
*/
|
||||
String getUTCOffsetString (bool includeDividerCharacters) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a string version of this date and time, using this machine's local timezone.
|
||||
|
||||
For a more powerful way of formatting the date and time, see the formatted() method.
|
||||
|
||||
@param includeDate whether to include the date in the string
|
||||
@param includeTime whether to include the time in the string
|
||||
@param includeSeconds if the time is being included, this provides an option not to include
|
||||
the seconds in it
|
||||
@param use24HourClock if the time is being included, sets whether to use am/pm or 24
|
||||
hour notation.
|
||||
@see formatted
|
||||
*/
|
||||
String toString (bool includeDate,
|
||||
bool includeTime,
|
||||
bool includeSeconds = true,
|
||||
bool use24HourClock = false) const;
|
||||
|
||||
/** Converts this date/time to a string with a user-defined format.
|
||||
|
||||
This uses the C strftime() function to format this time as a string. To save you
|
||||
looking it up, these are the escape codes that strftime uses (other codes might
|
||||
work on some platforms and not others, but these are the common ones):
|
||||
|
||||
- %a is replaced by the locale's abbreviated weekday name.
|
||||
- %A is replaced by the locale's full weekday name.
|
||||
- %b is replaced by the locale's abbreviated month name.
|
||||
- %B is replaced by the locale's full month name.
|
||||
- %c is replaced by the locale's appropriate date and time representation.
|
||||
- %d is replaced by the day of the month as a decimal number [01,31].
|
||||
- %H is replaced by the hour (24-hour clock) as a decimal number [00,23].
|
||||
- %I is replaced by the hour (12-hour clock) as a decimal number [01,12].
|
||||
- %j is replaced by the day of the year as a decimal number [001,366].
|
||||
- %m is replaced by the month as a decimal number [01,12].
|
||||
- %M is replaced by the minute as a decimal number [00,59].
|
||||
- %p is replaced by the locale's equivalent of either a.m. or p.m.
|
||||
- %S is replaced by the second as a decimal number [00,60].
|
||||
- %U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number [00,53].
|
||||
- %w is replaced by the weekday as a decimal number [0,6], with 0 representing Sunday.
|
||||
- %W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0.
|
||||
- %x is replaced by the locale's appropriate date representation.
|
||||
- %X is replaced by the locale's appropriate time representation.
|
||||
- %y is replaced by the year without century as a decimal number [00,99].
|
||||
- %Y is replaced by the year with century as a decimal number.
|
||||
- %Z is replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists.
|
||||
- %% is replaced by %.
|
||||
|
||||
@see toString
|
||||
*/
|
||||
String formatted (const String& format) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns a fully described string of this date and time in ISO-8601 format
|
||||
(using the local timezone).
|
||||
|
||||
@param includeDividerCharacters whether to include or omit the "-" and ":"
|
||||
dividers in the string
|
||||
*/
|
||||
String toISO8601 (bool includeDividerCharacters) const;
|
||||
|
||||
/** Parses an ISO-8601 string and returns it as a Time. */
|
||||
static Time fromISO8601 (StringRef iso8601);
|
||||
|
||||
//==============================================================================
|
||||
/** Adds a RelativeTime to this time. */
|
||||
Time& operator+= (RelativeTime delta) noexcept;
|
||||
/** Subtracts a RelativeTime from this time. */
|
||||
Time& operator-= (RelativeTime delta) noexcept;
|
||||
|
||||
//==============================================================================
|
||||
/** Tries to set the computer's clock.
|
||||
|
||||
@returns true if this succeeds, although depending on the system, the
|
||||
application might not have sufficient privileges to do this.
|
||||
*/
|
||||
bool setSystemTimeToThisTime() const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns the name of a day of the week.
|
||||
|
||||
@param dayNumber the day, 0 to 6 (0 = sunday, 1 = monday, etc)
|
||||
@param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if
|
||||
false, it'll return the full version, e.g. "Tuesday".
|
||||
*/
|
||||
static String getWeekdayName (int dayNumber, bool threeLetterVersion);
|
||||
|
||||
/** Returns the name of one of the months.
|
||||
|
||||
@param monthNumber the month, 0 to 11
|
||||
@param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false
|
||||
it'll return the long form, e.g. "January"
|
||||
*/
|
||||
static String getMonthName (int monthNumber, bool threeLetterVersion);
|
||||
|
||||
//==============================================================================
|
||||
// Static methods for getting system timers directly..
|
||||
|
||||
/** Returns the current system time.
|
||||
|
||||
Returns the number of milliseconds since midnight Jan 1st 1970 UTC.
|
||||
|
||||
Should be accurate to within a few millisecs, depending on platform,
|
||||
hardware, etc.
|
||||
*/
|
||||
static int64 currentTimeMillis() noexcept;
|
||||
|
||||
/** Returns the number of millisecs since a fixed event (usually system startup).
|
||||
|
||||
This returns a monotonically increasing value which is unaffected by changes to the
|
||||
system clock. It should be accurate to within a few millisecs, depending on platform,
|
||||
hardware, etc.
|
||||
|
||||
Being a 32-bit return value, it will of course wrap back to 0 after 2^32 seconds of
|
||||
uptime, so be careful to take that into account. If you need a 64-bit time, you can
|
||||
use currentTimeMillis() instead.
|
||||
|
||||
@see getApproximateMillisecondCounter
|
||||
*/
|
||||
static uint32 getMillisecondCounter() noexcept;
|
||||
|
||||
/** Returns the number of millisecs since a fixed event (usually system startup).
|
||||
|
||||
This has the same function as getMillisecondCounter(), but returns a more accurate
|
||||
value, using a higher-resolution timer if one is available.
|
||||
|
||||
@see getMillisecondCounter
|
||||
*/
|
||||
static double getMillisecondCounterHiRes() noexcept;
|
||||
|
||||
/** Waits until the getMillisecondCounter() reaches a given value.
|
||||
|
||||
This will make the thread sleep as efficiently as it can while it's waiting.
|
||||
*/
|
||||
static void waitForMillisecondCounter (uint32 targetTime) noexcept;
|
||||
|
||||
/** Less-accurate but faster version of getMillisecondCounter().
|
||||
|
||||
This will return the last value that getMillisecondCounter() returned, so doesn't
|
||||
need to make a system call, but is less accurate - it shouldn't be more than
|
||||
100ms away from the correct time, though, so is still accurate enough for a
|
||||
lot of purposes.
|
||||
|
||||
@see getMillisecondCounter
|
||||
*/
|
||||
static uint32 getApproximateMillisecondCounter() noexcept;
|
||||
|
||||
//==============================================================================
|
||||
// High-resolution timers..
|
||||
|
||||
/** Returns the current high-resolution counter's tick-count.
|
||||
|
||||
This is a similar idea to getMillisecondCounter(), but with a higher
|
||||
resolution.
|
||||
|
||||
@see getHighResolutionTicksPerSecond, highResolutionTicksToSeconds,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static int64 getHighResolutionTicks() noexcept;
|
||||
|
||||
/** Returns the resolution of the high-resolution counter in ticks per second.
|
||||
|
||||
@see getHighResolutionTicks, highResolutionTicksToSeconds,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static int64 getHighResolutionTicksPerSecond() noexcept;
|
||||
|
||||
/** Converts a number of high-resolution ticks into seconds.
|
||||
|
||||
@see getHighResolutionTicks, getHighResolutionTicksPerSecond,
|
||||
secondsToHighResolutionTicks
|
||||
*/
|
||||
static double highResolutionTicksToSeconds (int64 ticks) noexcept;
|
||||
|
||||
/** Converts a number seconds into high-resolution ticks.
|
||||
|
||||
@see getHighResolutionTicks, getHighResolutionTicksPerSecond,
|
||||
highResolutionTicksToSeconds
|
||||
*/
|
||||
static int64 secondsToHighResolutionTicks (double seconds) noexcept;
|
||||
|
||||
/** Returns a Time based on the value of the __DATE__ macro when this module was compiled */
|
||||
static Time getCompilationDate();
|
||||
|
||||
private:
|
||||
//==============================================================================
|
||||
int64 millisSinceEpoch = 0;
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
/** Adds a RelativeTime to a Time. */
|
||||
JUCE_API Time operator+ (Time time, RelativeTime delta) noexcept;
|
||||
/** Adds a RelativeTime to a Time. */
|
||||
JUCE_API Time operator+ (RelativeTime delta, Time time) noexcept;
|
||||
|
||||
/** Subtracts a RelativeTime from a Time. */
|
||||
JUCE_API Time operator- (Time time, RelativeTime delta) noexcept;
|
||||
/** Returns the relative time difference between two times. */
|
||||
JUCE_API const RelativeTime operator- (Time time1, Time time2) noexcept;
|
||||
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator== (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator!= (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator< (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator<= (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator> (Time time1, Time time2) noexcept;
|
||||
/** Compares two Time objects. */
|
||||
JUCE_API bool operator>= (Time time1, Time time2) noexcept;
|
||||
|
||||
} // namespace juce
|
||||
|
Reference in New Issue
Block a user