string: Add a function for creating a detailed time string

I use this to display the total running time of queues in the gui.

Signed-off-by: Anna Schumaker <Anna@OcarinaProject.net>
This commit is contained in:
Anna Schumaker 2015-01-29 08:27:25 -05:00
parent ed43fd3689
commit cc6f4c9293
7 changed files with 86 additions and 46 deletions

View File

@ -5,14 +5,11 @@
#include <core/callback.h> #include <core/callback.h>
#include <core/queue.h> #include <core/queue.h>
#include <core/random.h> #include <core/random.h>
#include <core/string.h>
#include <algorithm> #include <algorithm>
#include <sstream> #include <sstream>
#define O_MINUTES (60)
#define O_HOURS (60 * O_MINUTES)
#define O_DAYS (24 * O_HOURS)
Queue :: Queue(unsigned int flags) Queue :: Queue(unsigned int flags)
: _cur(-1), _flags(flags), _length(0) : _cur(-1), _flags(flags), _length(0)
@ -201,27 +198,9 @@ unsigned int Queue :: size()
return _tracks.size(); return _tracks.size();
} }
const std::string Queue :: length_str() unsigned int Queue :: length()
{ {
std::stringstream ss; return _length;
unsigned int factor[4] = { O_DAYS, O_HOURS, O_MINUTES, 1 };
std::string fields[4] = { "day", "hour", "minute", "second" };
unsigned int len = _length;
for (unsigned int i = 0; i < 4; i++) {
unsigned int dur = len / factor[i];
len -= dur * factor[i];
if (dur > 0) {
ss << dur << " " << fields[i];
if (dur > 1)
ss << "s";
if (len > 0)
ss << ", ";
}
}
return ss.str();
} }
class SortTracks { class SortTracks {

View File

@ -5,6 +5,10 @@
#include <core/string.h> #include <core/string.h>
#include <sstream> #include <sstream>
#define O_MINUTES (60)
#define O_HOURS (60 * O_MINUTES)
#define O_DAYS (24 * O_HOURS)
const std::string string :: utos(unsigned int u) const std::string string :: utos(unsigned int u)
{ {
std::stringstream ss; std::stringstream ss;
@ -24,3 +28,35 @@ const std::string string :: sec2str(unsigned int sec)
ss << seconds; ss << seconds;
return ss.str(); return ss.str();
} }
const std::string _time_detail(unsigned int value, unsigned int remaining,
const std::string &field)
{
std::string res;
if (value > 0) {
res += string :: utos(value) + " " + field;
if (value > 1)
res += "s";
if (remaining > 0)
res += ", ";
}
return res;
}
const std::string string :: sec2str_detailed(unsigned int sec)
{
std::string res;
unsigned int factor[3] = { O_DAYS, O_HOURS, O_MINUTES };
std::string field[3] = { "day", "hour", "minute" };
unsigned int val;
for (unsigned int i = 0; i < 3; i++) {
val = sec / factor[i];
sec %= factor[i];
res += _time_detail(val, sec, field[i]);
}
res += _time_detail(sec, 0, "second");
return res;
}

View File

@ -110,7 +110,7 @@ bool Tab :: tab_is_cur()
void Tab :: tab_runtime_changed() void Tab :: tab_runtime_changed()
{ {
if (tab_is_cur()) if (tab_is_cur())
gui :: get_widget<Gtk::Label>("o_queue_time")->set_text(tab_pq->length_str()); gui :: get_widget<Gtk::Label>("o_queue_time")->set_text(string :: sec2str_detailed(tab_pq->length()));
} }
void Tab :: tab_display_sorting() void Tab :: tab_display_sorting()

View File

@ -168,9 +168,9 @@ public:
/** /**
* Find the runtime of the queue. * Find the runtime of the queue.
* *
* @return The runtime of the queue, as a string. * @return The runtime of the queue.
*/ */
const std::string length_str(); unsigned int length();
/** /**

View File

@ -22,10 +22,18 @@ namespace string
/** /**
* Convert from seconds to a time string. * Convert from seconds to a time string.
* @param sec Number of seconds. * @param sec Number of seconds.
* @return A string in mm:ss format. * @return A string in mm:ss format.
*/ */
const std::string sec2str(unsigned int); const std::string sec2str(unsigned int);
/**
* Convert from seconds to a detailed time string.
* @param sec Number of seconds.
* @return A string listing the length in terms of days,
* months, hours, minutes, and seconds.
*/
const std::string sec2str_detailed(unsigned int);
} }
#endif /* OCARINA_CORE_STRING_H */ #endif /* OCARINA_CORE_STRING_H */

View File

@ -22,7 +22,6 @@ public:
TestQueue(unsigned int f) : Queue(f) {} TestQueue(unsigned int f) : Queue(f) {}
unsigned int get_cur() { return _cur; } unsigned int get_cur() { return _cur; }
unsigned int get_flags() { return _flags; } unsigned int get_flags() { return _flags; }
unsigned int get_length() { return _length; }
std::vector <sort_info> get_sorder() { return _sort_order; }; std::vector <sort_info> get_sorder() { return _sort_order; };
}; };
@ -37,7 +36,7 @@ void test_default()
test_equal(q.get_cur(), (unsigned)-1); test_equal(q.get_cur(), (unsigned)-1);
test_equal(q.get_flags(), (unsigned)0); test_equal(q.get_flags(), (unsigned)0);
test_equal(q.get_length(), (unsigned)0); test_equal(q.length(), (unsigned)0);
test_equal(q.get_sorder().size(), (size_t)0); test_equal(q.get_sorder().size(), (size_t)0);
test_equal(q.next(), (Track *)NULL); test_equal(q.next(), (Track *)NULL);
} }
@ -49,7 +48,7 @@ void test_constructor()
test_equal(q.get_cur(), (unsigned)-1); test_equal(q.get_cur(), (unsigned)-1);
test_equal(q.get_flags(), flags); test_equal(q.get_flags(), flags);
test_equal(q.get_length(), (unsigned)0); test_equal(q.length(), (unsigned)0);
test_equal(q.get_sorder().size(), (size_t)0); test_equal(q.get_sorder().size(), (size_t)0);
test_equal(q.next(), (Track *)NULL); test_equal(q.next(), (Track *)NULL);
} }
@ -132,46 +131,40 @@ void test_add_remove()
get_callbacks()->on_queue_track_add = test_add_cb; get_callbacks()->on_queue_track_add = test_add_cb;
get_callbacks()->on_queue_track_del = test_del_cb; get_callbacks()->on_queue_track_del = test_del_cb;
test_equal(q.get_length(), expected); test_equal(q.length(), expected);
test_equal(q.length_str(), (std::string)"");
test_equal(q.size(), (unsigned)0); test_equal(q.size(), (unsigned)0);
/* Add tracks */ /* Add tracks */
test_for_each(0, 24, 1, _test_add_loop); test_for_each(0, 24, 1, _test_add_loop);
test_equal(q.get_length(), expected); test_equal(q.length(), expected);
test_equal(q.length_str(), (std::string)"1 hour, 26 minutes");
test_equal(q.size(), (unsigned)24); test_equal(q.size(), (unsigned)24);
/* Add everything again */ /* Add everything again */
test_for_each(24, 48, 1, _test_add_loop); test_for_each(24, 48, 1, _test_add_loop);
test_equal(q.get_length(), expected); test_equal(q.length(), expected);
test_equal(q.length_str(), (std::string)"2 hours, 52 minutes");
test_equal(q.size(), (unsigned)48); test_equal(q.size(), (unsigned)48);
/* Test removing multiple tracks at once */ /* Test removing multiple tracks at once */
count_del = 0; count_del = 0;
test_for_each(0, 12, 1, _test_del_loop); test_for_each(0, 12, 1, _test_del_loop);
test_equal(q.get_length(), expected); test_equal(q.length(), expected);
test_equal(q.length_str(), (std::string)"1 hour, 50 minutes");
test_equal(q.size(), (unsigned)24); test_equal(q.size(), (unsigned)24);
/* Test removing tracks one at a time */ /* Test removing tracks one at a time */
count_del = 0; count_del = 0;
test_for_each(0, 12, 1, _test_del_middle_loop); test_for_each(0, 12, 1, _test_del_middle_loop);
test_equal(q.get_length(), expected); test_equal(q.length(), expected);
test_equal(q.length_str(), (std::string)"55 minutes");
test_equal(q.size(), (unsigned)12); test_equal(q.size(), (unsigned)12);
/* Remove remaining tracks */ /* Remove remaining tracks */
count_del = 0; count_del = 0;
test_for_each(0, 12, 1, _test_del_front_loop); test_for_each(0, 12, 1, _test_del_front_loop);
test_equal(q.get_length(), (unsigned)0); test_equal(q.length(), (unsigned)0);
test_equal(q.length_str(), (std::string)"");
test_equal(q.size(), (unsigned)0); test_equal(q.size(), (unsigned)0);
} }
@ -254,7 +247,7 @@ void test_next()
test_for_each(0, 24, 1, _test_next_loop); test_for_each(0, 24, 1, _test_next_loop);
test_equal(q.size(), (unsigned)0); test_equal(q.size(), (unsigned)0);
test_equal(q.length_str(), (std::string)""); test_equal(q.length(), 0);
test_equal(q.next(), TRACK_NULL); test_equal(q.next(), TRACK_NULL);
@ -264,7 +257,7 @@ void test_next()
test_for_each(0, 24, 1, _test_next_rand_loop); test_for_each(0, 24, 1, _test_next_rand_loop);
test_equal(q.size(), (unsigned)0); test_equal(q.size(), (unsigned)0);
test_equal(q.length_str(), (std::string)""); test_equal(q.length(), 0);
test_equal(q.next(), TRACK_NULL); test_equal(q.next(), TRACK_NULL);
@ -380,7 +373,7 @@ void test_saving()
test_equal(r.has_flag(Q_RANDOM), q.has_flag(Q_RANDOM)); test_equal(r.has_flag(Q_RANDOM), q.has_flag(Q_RANDOM));
test_equal(r.size(), q.size()); test_equal(r.size(), q.size());
test_equal(r.length_str(), q.length_str()); test_equal(r.length(), q.length());
test_for_each(0, 24, 1, _test_saving_loop); test_for_each(0, 24, 1, _test_saving_loop);
} }

View File

@ -29,8 +29,32 @@ void test_sec2str()
test_equal(string :: sec2str(675), "11:15"); test_equal(string :: sec2str(675), "11:15");
} }
void test_sec2str_detailed()
{
unsigned int minute = 60;
unsigned int hour = 3600;
unsigned int day = 86400;
test_equal(string :: sec2str_detailed(day), "1 day");
test_equal(string :: sec2str_detailed(2 * day), "2 days");
test_equal(string :: sec2str_detailed(day + hour), "1 day, 1 hour");
test_equal(string :: sec2str_detailed(hour), "1 hour");
test_equal(string :: sec2str_detailed(2 * hour), "2 hours");
test_equal(string :: sec2str_detailed(hour + minute), "1 hour, 1 minute");
test_equal(string :: sec2str_detailed(minute), "1 minute");
test_equal(string :: sec2str_detailed(2 * minute), "2 minutes");
test_equal(string :: sec2str_detailed(minute + 1), "1 minute, 1 second");
test_equal(string :: sec2str_detailed(1), "1 second");
test_equal(string :: sec2str_detailed(2), "2 seconds");
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
test :: run("Unsigned to String Test", test_utos); test :: run("Unsigned to String Test", test_utos);
test :: run("Seconds to String Test", test_sec2str); test :: run("Seconds to String Test", test_sec2str);
test :: run("Seconds to String (Detailed) Test", test_sec2str_detailed);
} }