#include <errno.h>
#include <list>
#include <string>
+#include <cstdlib>
#include <boost/optional.hpp>
inline Time &subtract (const time_t t2) NOEXCEPT
{ return this->subtract (t2, 0L); };
- Time &scale (const time_t factor) NOEXCEPT;
+ Time &scale (const int64_t factor) NOEXCEPT;
+
+ Time ÷ (const int64_t divisor) NOEXCEPT;
friend int compare (const Time &t1, const Time &t2) NOEXCEPT;
{ return this->subtract (t2); }
inline Time
- operator* (const time_t factor) const NOEXCEPT
+ operator* (const int64_t factor) const NOEXCEPT
{ return Time (*this).scale (factor); }
inline Time &
- operator*= (const time_t factor) NOEXCEPT
+ operator*= (const int64_t factor) NOEXCEPT
{ return this->scale (factor); }
+ inline Time
+ operator/ (const int64_t divisor) const NOEXCEPT
+ { return Time (*this).divide (divisor); }
+
+ inline Time &
+ operator/= (const int64_t divisor) NOEXCEPT
+ { return this->divide (divisor); }
+
friend CONSTEXPR bool
operator== (const Time &t1, const Time &t2) NOEXCEPT;
operator- (const time_t t1, const Time &t2) NOEXCEPT
{ return Time (t1) - t2; }
+ inline Time
+ operator* (const time_t t1, const Time &t2) NOEXCEPT
+ { return t2 * t1; }
+
int compare (const Time &t1, const Time &t2) NOEXCEPT;
/*
const enum type::id id = type::real,
const enum type::variant var = type::dflt) NOEXCEPT;
+ template <typename ContT>
+ Time
+ mean (const ContT &data)
+ {
+ Time sum (0, 0);
+
+ if (data.size () == 0) {
+ return sum;
+ }
+
+ for (typename ContT::const_iterator it = data.begin ();
+ it != data.end (); ++it)
+ {
+ sum += *it;
+ };
+
+ return sum.divide (static_cast<int64_t> (data.size ()));
+ };
+
+ template <typename ContT>
+ Time
+ median (const ContT &data)
+ {
+ if (data.size () == 0) {
+ return zero ();
+ }
+ if (data.size () == 1) {
+ return *data.begin ();
+ }
+
+ std::vector<typename ContT::value_type> sorted;
+ std::copy (data.begin (), data.end (), std::back_inserter (sorted));
+ std::sort (sorted.begin (), sorted.end ());
+
+ return sorted [data.size () / 2];
+ };
+
} /* [namespace clock] */
} /* [namespace I2n] */
BOOST_CHECK_GT( t2, *t1);
}
- BOOST_AUTO_TEST_CASE(containers_list)
- {
- std::list<I2n::clock::Time> ts;
-
- ts.push_back (I2n::clock::zero ());
- ts.push_back (I2n::clock::zero ());
-
- BOOST_CHECK_EQUAL(ts.size (), 2);
- }
-
- BOOST_AUTO_TEST_CASE(containers_vec)
- {
- std::vector<I2n::clock::Time> ts;
-
- ts.push_back (I2n::clock::zero ());
- ts.push_back (I2n::clock::zero ());
-
- BOOST_CHECK_EQUAL(ts.size (), 2);
- }
-
- BOOST_AUTO_TEST_CASE(containers_set)
- {
- std::set<I2n::clock::Time> ts;
-
- ts.insert (I2n::clock::zero ());
- ts.insert (I2n::clock::Time (42, 2187));
- ts.insert (I2n::clock::zero ());
-
- BOOST_CHECK_EQUAL(ts.size (), 2);
- }
-
BOOST_AUTO_TEST_CASE(FormatISO8601_T)
{
I2n::clock::Time t (42, 42);
BOOST_CHECK_EQUAL(*t3->format_iso8601 (true, false, true, false), in3);
}
+ BOOST_AUTO_TEST_CASE(containers_list)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::zero ());
+ ts.push_back (I2n::clock::zero ());
+
+ BOOST_CHECK_EQUAL(ts.size (), 2);
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_vec)
+ {
+ std::vector<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::zero ());
+ ts.push_back (I2n::clock::zero ());
+
+ BOOST_CHECK_EQUAL(ts.size (), 2);
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_set)
+ {
+ std::set<I2n::clock::Time> ts;
+
+ ts.insert (I2n::clock::zero ());
+ ts.insert (I2n::clock::Time (42, 2187));
+ ts.insert (I2n::clock::zero ());
+
+ BOOST_CHECK_EQUAL(ts.size (), 2);
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_list_mean)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::Time (42, 42));
+ ts.push_back (I2n::clock::Time (1337, 1337));
+
+ BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
+ I2n::clock::Time (689, 500000689));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_list_mean_zero)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::Time (0, 0));
+ ts.push_back (I2n::clock::Time (0, 0));
+ ts.push_back (I2n::clock::Time (0, 0));
+ ts.push_back (I2n::clock::Time (0, 0));
+
+ BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
+ I2n::clock::zero ());
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_list_mean_empty)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ BOOST_CHECK_EQUAL(I2n::clock::mean (ts), I2n::clock::Time (0, 0));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_set_mean)
+ {
+ std::set<I2n::clock::Time> ts;
+
+ ts.insert (I2n::clock::Time (42));
+ ts.insert (I2n::clock::Time (1337));
+ ts.insert (I2n::clock::Time (2187));
+
+ BOOST_CHECK_EQUAL(I2n::clock::mean (ts),
+ I2n::clock::Time (1188, 666666666));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_set_median_empty)
+ {
+ std::set<I2n::clock::Time> ts;
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0, 0));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_set_median_one)
+ {
+ std::set<I2n::clock::Time> ts;
+
+ ts.insert (I2n::clock::Time (42, 0));
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts),
+ I2n::clock::Time (42, 0));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_set_median_multi)
+ {
+ std::set<I2n::clock::Time> ts;
+
+ ts.insert (I2n::clock::Time (42));
+ ts.insert (I2n::clock::Time (1337));
+ ts.insert (I2n::clock::Time (2187));
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_vec_median_multi)
+ {
+ std::vector<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::Time (42));
+ ts.push_back (I2n::clock::Time (1337));
+ ts.push_back (I2n::clock::Time (2187));
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (1337));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_list_median_multi)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::Time (42));
+ ts.push_back (I2n::clock::Time (1337));
+ ts.push_back (I2n::clock::Time (2187));
+ ts.push_back (I2n::clock::Time (0xcafebabe));
+ ts.push_back (I2n::clock::Time (0xdeadbeef));
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (2187));
+ }
+
+ BOOST_AUTO_TEST_CASE(containers_list_median_multi_evensize)
+ {
+ std::list<I2n::clock::Time> ts;
+
+ ts.push_back (I2n::clock::Time (42));
+ ts.push_back (I2n::clock::Time (1337));
+ ts.push_back (I2n::clock::Time (2187));
+ ts.push_back (I2n::clock::Time (0xf00d));
+ ts.push_back (I2n::clock::Time (0xcafebabe));
+ ts.push_back (I2n::clock::Time (0xdeadbeef));
+
+ BOOST_CHECK_EQUAL(I2n::clock::median (ts), I2n::clock::Time (0xf00d));
+ }
+
BOOST_AUTO_TEST_SUITE_END() /* [Clock] */
BOOST_AUTO_TEST_SUITE_END()