dependent on maxscale for use in both maxscale and system test, and possibly other apps. As time permits general purpose utilities from maxscale-common can be moved to the new library. Here are answers to questions you may have: - Headers and sources are separated to allow public/private headers. - A top level directory "util" contains the libraries. The current structure is simply util/maxbase. The name of the top level directory is not important. - Code is in a namespace with the same name as the directory. - Headers are included like this: \`#include <maxbase/stopwatch.hh>\` - In case the library is published on its own, the include directives stay the same (headers would be in /usr/include/maxbase, for example). - I am not advocating many small libraries. But if some larger library is written, say a general purpose statemachine, it would not pollute util/maxutil but go to util/maxsm. Another example: Worker. It is a larger concept, but used so widely in code that it could very well live in maxutil. NOTE: this was previously Review Request #6245.
62 lines
1.6 KiB
C++
62 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2018 MariaDB Corporation Ab
|
|
*
|
|
* Use of this software is governed by the Business Source License included
|
|
* in the LICENSE.TXT file and at www.mariadb.com/bsl11.
|
|
*
|
|
* Change Date: 2020-01-01
|
|
*
|
|
* On the date above, in accordance with the Business Source License, use
|
|
* of this software will be governed by version 2 or later of the General
|
|
* Public License.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <chrono>
|
|
#include <iosfwd>
|
|
#include <string>
|
|
|
|
namespace base
|
|
{
|
|
|
|
#if __cplusplus >= 201103
|
|
typedef std::chrono::steady_clock Clock;
|
|
#else
|
|
typedef std::chrono::system_clock Clock;
|
|
#endif
|
|
|
|
struct Duration : public Clock::duration // for ADL
|
|
{
|
|
// gcc 4.4 does not inherit constructors, so this is a bit limited.
|
|
Duration() = default;
|
|
Duration(long long l) : Clock::duration(l) {}
|
|
Duration(Clock::duration d) : Clock::duration(d) {}
|
|
};
|
|
|
|
typedef std::chrono::time_point<Clock, Duration> TimePoint;
|
|
|
|
class StopWatch
|
|
{
|
|
public:
|
|
// Starts the stopwatch, which is always running.
|
|
StopWatch();
|
|
// Get elapsed time.
|
|
Duration lap() const;
|
|
// Get elapsed time, restart StopWatch.
|
|
Duration restart();
|
|
private:
|
|
TimePoint m_start;
|
|
};
|
|
|
|
// Returns the value as a double and string adjusted to a suffix like ms for milliseconds.
|
|
std::pair<double, std::string> dur_to_human_readable(Duration dur);
|
|
|
|
// Human readable output. No standard library for it yet.
|
|
std::ostream& operator<<(std::ostream&, Duration dur);
|
|
|
|
// TimePoint
|
|
std::string time_point_to_string(TimePoint tp, const std::string& fmt = "%F %T");
|
|
std::ostream& operator<<(std::ostream&, TimePoint tp);
|
|
|
|
} // base
|