OpenShot Audio Library | OpenShotAudio  0.6.0
juce_RelativeTime.cpp
1 /*
2  ==============================================================================
3 
4  This file is part of the JUCE library.
5  Copyright (c) 2022 - Raw Material Software Limited
6 
7  JUCE is an open source library subject to commercial or open-source
8  licensing.
9 
10  The code included in this file is provided under the terms of the ISC license
11  http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12  To use, copy, modify, and/or distribute this software for any purpose with or
13  without fee is hereby granted provided that the above copyright notice and
14  this permission notice appear in all copies.
15 
16  JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17  EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18  DISCLAIMED.
19 
20  ==============================================================================
21 */
22 
23 namespace juce
24 {
25 
26 RelativeTime::RelativeTime (const double secs) noexcept : numSeconds (secs) {}
27 RelativeTime::RelativeTime (const RelativeTime& other) noexcept : numSeconds (other.numSeconds) {}
29 
30 //==============================================================================
31 RelativeTime RelativeTime::milliseconds (int milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
32 RelativeTime RelativeTime::milliseconds (int64 milliseconds) noexcept { return RelativeTime ((double) milliseconds * 0.001); }
33 RelativeTime RelativeTime::seconds (double s) noexcept { return RelativeTime (s); }
34 RelativeTime RelativeTime::minutes (double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); }
35 RelativeTime RelativeTime::hours (double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); }
36 RelativeTime RelativeTime::days (double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); }
37 RelativeTime RelativeTime::weeks (double numberOfWeeks) noexcept { return RelativeTime (numberOfWeeks * (60.0 * 60.0 * 24.0 * 7.0)); }
38 
39 //==============================================================================
40 int64 RelativeTime::inMilliseconds() const noexcept { return (int64) (numSeconds * 1000.0); }
41 double RelativeTime::inMinutes() const noexcept { return numSeconds / 60.0; }
42 double RelativeTime::inHours() const noexcept { return numSeconds / (60.0 * 60.0); }
43 double RelativeTime::inDays() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0); }
44 double RelativeTime::inWeeks() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0 * 7.0); }
45 
46 //==============================================================================
47 RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept { numSeconds = other.numSeconds; return *this; }
48 
49 RelativeTime RelativeTime::operator+= (RelativeTime t) noexcept { numSeconds += t.numSeconds; return *this; }
50 RelativeTime RelativeTime::operator-= (RelativeTime t) noexcept { numSeconds -= t.numSeconds; return *this; }
51 RelativeTime RelativeTime::operator+= (double secs) noexcept { numSeconds += secs; return *this; }
52 RelativeTime RelativeTime::operator-= (double secs) noexcept { numSeconds -= secs; return *this; }
53 
54 JUCE_API RelativeTime JUCE_CALLTYPE operator+ (RelativeTime t1, RelativeTime t2) noexcept { return t1 += t2; }
55 JUCE_API RelativeTime JUCE_CALLTYPE operator- (RelativeTime t1, RelativeTime t2) noexcept { return t1 -= t2; }
56 
57 JUCE_API bool JUCE_CALLTYPE operator== (RelativeTime t1, RelativeTime t2) noexcept
58 {
59  return exactlyEqual (t1.inSeconds(), t2.inSeconds());
60 }
61 
62 JUCE_API bool JUCE_CALLTYPE operator!= (RelativeTime t1, RelativeTime t2) noexcept
63 {
64  return ! (t1 == t2);
65 }
66 
67 JUCE_API bool JUCE_CALLTYPE operator> (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() > t2.inSeconds(); }
68 JUCE_API bool JUCE_CALLTYPE operator< (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() < t2.inSeconds(); }
69 JUCE_API bool JUCE_CALLTYPE operator>= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); }
70 JUCE_API bool JUCE_CALLTYPE operator<= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); }
71 
72 //==============================================================================
73 static String translateTimeField (int n, const char* singular, const char* plural)
74 {
75  return TRANS (n == 1 ? singular : plural).replace (n == 1 ? "1" : "2", String (n));
76 }
77 
78 static String describeYears (int n) { return translateTimeField (n, NEEDS_TRANS ("1 year"), NEEDS_TRANS ("2 years")); }
79 static String describeMonths (int n) { return translateTimeField (n, NEEDS_TRANS ("1 month"), NEEDS_TRANS ("2 months")); }
80 static String describeWeeks (int n) { return translateTimeField (n, NEEDS_TRANS ("1 week"), NEEDS_TRANS ("2 weeks")); }
81 static String describeDays (int n) { return translateTimeField (n, NEEDS_TRANS ("1 day"), NEEDS_TRANS ("2 days")); }
82 static String describeHours (int n) { return translateTimeField (n, NEEDS_TRANS ("1 hr"), NEEDS_TRANS ("2 hrs")); }
83 static String describeMinutes (int n) { return translateTimeField (n, NEEDS_TRANS ("1 min"), NEEDS_TRANS ("2 mins")); }
84 static String describeSeconds (int n) { return translateTimeField (n, NEEDS_TRANS ("1 sec"), NEEDS_TRANS ("2 secs")); }
85 
87 {
88  if (numSeconds <= 1.0)
89  return "< 1 sec";
90 
91  auto weeks = (int) inWeeks();
92 
93  if (weeks > 52) return describeYears (weeks / 52);
94  if (weeks > 8) return describeMonths ((weeks * 12) / 52);
95  if (weeks > 1) return describeWeeks (weeks);
96 
97  auto days = (int) inDays();
98 
99  if (days > 1)
100  return describeDays (days);
101 
102  auto hours = (int) inHours();
103 
104  if (hours > 0)
105  return describeHours (hours);
106 
107  auto minutes = (int) inMinutes();
108 
109  if (minutes > 0)
110  return describeMinutes (minutes);
111 
112  return describeSeconds ((int) numSeconds);
113 }
114 
115 String RelativeTime::getDescription (const String& returnValueForZeroTime) const
116 {
117  if (std::abs (numSeconds) < 0.001)
118  return returnValueForZeroTime;
119 
120  if (numSeconds < 0)
121  return "-" + RelativeTime (-numSeconds).getDescription();
122 
123  StringArray fields;
124 
125  auto n = (int) inWeeks();
126 
127  if (n > 0)
128  fields.add (describeWeeks (n));
129 
130  n = ((int) inDays()) % 7;
131 
132  if (n > 0)
133  fields.add (describeDays (n));
134 
135  if (fields.size() < 2)
136  {
137  n = ((int) inHours()) % 24;
138 
139  if (n > 0)
140  fields.add (describeHours (n));
141 
142  if (fields.size() < 2)
143  {
144  n = ((int) inMinutes()) % 60;
145 
146  if (n > 0)
147  fields.add (describeMinutes (n));
148 
149  if (fields.size() < 2)
150  {
151  n = ((int) inSeconds()) % 60;
152 
153  if (n > 0)
154  fields.add (describeSeconds (n));
155 
156  if (fields.isEmpty())
157  fields.add (String (((int) inMilliseconds()) % 1000) + " " + TRANS ("ms"));
158  }
159  }
160  }
161 
162  return fields.joinIntoString (" ");
163 }
164 
165 } // namespace juce
int64 inMilliseconds() const noexcept
static RelativeTime minutes(double numberOfMinutes) noexcept
double inWeeks() const noexcept
String getDescription(const String &returnValueForZeroTime="0") const
double inDays() const noexcept
double inHours() const noexcept
static RelativeTime milliseconds(int milliseconds) noexcept
double inSeconds() const noexcept
static RelativeTime hours(double numberOfHours) noexcept
static RelativeTime days(double numberOfDays) noexcept
RelativeTime & operator=(const RelativeTime &other) noexcept
RelativeTime operator+=(RelativeTime timeToAdd) noexcept
RelativeTime operator-=(RelativeTime timeToSubtract) noexcept
String getApproximateDescription() const
static RelativeTime weeks(double numberOfWeeks) noexcept
static RelativeTime seconds(double seconds) noexcept
RelativeTime(double seconds=0.0) noexcept
double inMinutes() const noexcept
String joinIntoString(StringRef separatorString, int startIndex=0, int numberOfElements=-1) const
int size() const noexcept
void add(String stringToAdd)
bool isEmpty() const noexcept