1*b0d29bc4SBrooks Davis // Copyright 2010 The Kyua Authors. 2*b0d29bc4SBrooks Davis // All rights reserved. 3*b0d29bc4SBrooks Davis // 4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without 5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are 6*b0d29bc4SBrooks Davis // met: 7*b0d29bc4SBrooks Davis // 8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright 9*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer. 10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright 11*b0d29bc4SBrooks Davis // notice, this list of conditions and the following disclaimer in the 12*b0d29bc4SBrooks Davis // documentation and/or other materials provided with the distribution. 13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors 14*b0d29bc4SBrooks Davis // may be used to endorse or promote products derived from this software 15*b0d29bc4SBrooks Davis // without specific prior written permission. 16*b0d29bc4SBrooks Davis // 17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*b0d29bc4SBrooks Davis 29*b0d29bc4SBrooks Davis /// \file utils/datetime.hpp 30*b0d29bc4SBrooks Davis /// Provides date and time-related classes and functions. 31*b0d29bc4SBrooks Davis 32*b0d29bc4SBrooks Davis #if !defined(UTILS_DATETIME_HPP) 33*b0d29bc4SBrooks Davis #define UTILS_DATETIME_HPP 34*b0d29bc4SBrooks Davis 35*b0d29bc4SBrooks Davis #include "utils/datetime_fwd.hpp" 36*b0d29bc4SBrooks Davis 37*b0d29bc4SBrooks Davis extern "C" { 38*b0d29bc4SBrooks Davis #include <stdint.h> 39*b0d29bc4SBrooks Davis } 40*b0d29bc4SBrooks Davis 41*b0d29bc4SBrooks Davis #include <cstddef> 42*b0d29bc4SBrooks Davis #include <memory> 43*b0d29bc4SBrooks Davis #include <ostream> 44*b0d29bc4SBrooks Davis #include <string> 45*b0d29bc4SBrooks Davis 46*b0d29bc4SBrooks Davis 47*b0d29bc4SBrooks Davis namespace utils { 48*b0d29bc4SBrooks Davis namespace datetime { 49*b0d29bc4SBrooks Davis 50*b0d29bc4SBrooks Davis 51*b0d29bc4SBrooks Davis /// Represents a time delta to describe deadlines. 52*b0d29bc4SBrooks Davis /// 53*b0d29bc4SBrooks Davis /// Because we use this class to handle deadlines, we currently do not support 54*b0d29bc4SBrooks Davis /// negative deltas. 55*b0d29bc4SBrooks Davis class delta { 56*b0d29bc4SBrooks Davis public: 57*b0d29bc4SBrooks Davis /// The amount of seconds in the time delta. 58*b0d29bc4SBrooks Davis int64_t seconds; 59*b0d29bc4SBrooks Davis 60*b0d29bc4SBrooks Davis /// The amount of microseconds in the time delta. 61*b0d29bc4SBrooks Davis unsigned long useconds; 62*b0d29bc4SBrooks Davis 63*b0d29bc4SBrooks Davis delta(void); 64*b0d29bc4SBrooks Davis delta(const int64_t, const unsigned long); 65*b0d29bc4SBrooks Davis 66*b0d29bc4SBrooks Davis static delta from_microseconds(const int64_t); 67*b0d29bc4SBrooks Davis int64_t to_microseconds(void) const; 68*b0d29bc4SBrooks Davis 69*b0d29bc4SBrooks Davis bool operator==(const delta&) const; 70*b0d29bc4SBrooks Davis bool operator!=(const delta&) const; 71*b0d29bc4SBrooks Davis bool operator<(const delta&) const; 72*b0d29bc4SBrooks Davis bool operator<=(const delta&) const; 73*b0d29bc4SBrooks Davis bool operator>(const delta&) const; 74*b0d29bc4SBrooks Davis bool operator>=(const delta&) const; 75*b0d29bc4SBrooks Davis 76*b0d29bc4SBrooks Davis delta operator+(const delta&) const; 77*b0d29bc4SBrooks Davis delta& operator+=(const delta&); 78*b0d29bc4SBrooks Davis // operator- and operator-= do not exist because we do not support negative 79*b0d29bc4SBrooks Davis // deltas. See class docstring. 80*b0d29bc4SBrooks Davis delta operator*(const std::size_t) const; 81*b0d29bc4SBrooks Davis delta& operator*=(const std::size_t); 82*b0d29bc4SBrooks Davis }; 83*b0d29bc4SBrooks Davis 84*b0d29bc4SBrooks Davis 85*b0d29bc4SBrooks Davis std::ostream& operator<<(std::ostream&, const delta&); 86*b0d29bc4SBrooks Davis 87*b0d29bc4SBrooks Davis 88*b0d29bc4SBrooks Davis /// Represents a fixed date/time. 89*b0d29bc4SBrooks Davis /// 90*b0d29bc4SBrooks Davis /// Timestamps are immutable objects and therefore we can simply use a shared 91*b0d29bc4SBrooks Davis /// pointer to hide the implementation type of the date. By not using an auto 92*b0d29bc4SBrooks Davis /// pointer, we don't have to worry about providing our own copy constructor and 93*b0d29bc4SBrooks Davis /// assignment opertor. 94*b0d29bc4SBrooks Davis class timestamp { 95*b0d29bc4SBrooks Davis struct impl; 96*b0d29bc4SBrooks Davis 97*b0d29bc4SBrooks Davis /// Pointer to the shared internal implementation. 98*b0d29bc4SBrooks Davis std::shared_ptr< impl > _pimpl; 99*b0d29bc4SBrooks Davis 100*b0d29bc4SBrooks Davis timestamp(std::shared_ptr< impl >); 101*b0d29bc4SBrooks Davis 102*b0d29bc4SBrooks Davis public: 103*b0d29bc4SBrooks Davis static timestamp from_microseconds(const int64_t); 104*b0d29bc4SBrooks Davis static timestamp from_values(const int, const int, const int, 105*b0d29bc4SBrooks Davis const int, const int, const int, 106*b0d29bc4SBrooks Davis const int); 107*b0d29bc4SBrooks Davis static timestamp now(void); 108*b0d29bc4SBrooks Davis 109*b0d29bc4SBrooks Davis std::string strftime(const std::string&) const; 110*b0d29bc4SBrooks Davis std::string to_iso8601_in_utc(void) const; 111*b0d29bc4SBrooks Davis int64_t to_microseconds(void) const; 112*b0d29bc4SBrooks Davis int64_t to_seconds(void) const; 113*b0d29bc4SBrooks Davis 114*b0d29bc4SBrooks Davis bool operator==(const timestamp&) const; 115*b0d29bc4SBrooks Davis bool operator!=(const timestamp&) const; 116*b0d29bc4SBrooks Davis bool operator<(const timestamp&) const; 117*b0d29bc4SBrooks Davis bool operator<=(const timestamp&) const; 118*b0d29bc4SBrooks Davis bool operator>(const timestamp&) const; 119*b0d29bc4SBrooks Davis bool operator>=(const timestamp&) const; 120*b0d29bc4SBrooks Davis 121*b0d29bc4SBrooks Davis timestamp operator+(const delta&) const; 122*b0d29bc4SBrooks Davis timestamp& operator+=(const delta&); 123*b0d29bc4SBrooks Davis timestamp operator-(const delta&) const; 124*b0d29bc4SBrooks Davis timestamp& operator-=(const delta&); 125*b0d29bc4SBrooks Davis delta operator-(const timestamp&) const; 126*b0d29bc4SBrooks Davis }; 127*b0d29bc4SBrooks Davis 128*b0d29bc4SBrooks Davis 129*b0d29bc4SBrooks Davis std::ostream& operator<<(std::ostream&, const timestamp&); 130*b0d29bc4SBrooks Davis 131*b0d29bc4SBrooks Davis 132*b0d29bc4SBrooks Davis void set_mock_now(const int, const int, const int, const int, const int, 133*b0d29bc4SBrooks Davis const int, const int); 134*b0d29bc4SBrooks Davis void set_mock_now(const timestamp&); 135*b0d29bc4SBrooks Davis 136*b0d29bc4SBrooks Davis 137*b0d29bc4SBrooks Davis } // namespace datetime 138*b0d29bc4SBrooks Davis } // namespace utils 139*b0d29bc4SBrooks Davis 140*b0d29bc4SBrooks Davis #endif // !defined(UTILS_DATETIME_HPP) 141