| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| **/ |
| |
| #ifndef QUICKSTEP_TYPES_INTERVAL_LIT_HPP_ |
| #define QUICKSTEP_TYPES_INTERVAL_LIT_HPP_ |
| |
| #include <cstdint> |
| #include <limits> |
| |
| #include "utility/Macros.hpp" |
| |
| #include "glog/logging.h" |
| |
| namespace quickstep { |
| |
| /** \addtogroup Types |
| * @{ |
| */ |
| |
| /** |
| * @brief A literal representing the datetime interval. |
| **/ |
| struct DatetimeIntervalLit { |
| std::int64_t interval_ticks; |
| |
| static constexpr std::int64_t kTicksPerSecond = INT64_C(1000000); |
| |
| // The maximum number of characters needed to print out a DatetimeInterval in |
| // the "standard" format. |
| static constexpr int kPrintingChars |
| = 1 // Possible '-' prefix |
| + std::numeric_limits<std::int64_t>::digits10 // Day |
| + 6 // " days " |
| + 2 // Hour |
| + 1 // : |
| + 2 // Minute |
| + 1 // : |
| + 2 // Second |
| + 1 // . |
| + 6; // Subseconds. |
| |
| inline std::int64_t seconds() const { |
| return interval_ticks / kTicksPerSecond; |
| } |
| |
| inline std::int64_t subseconds() const { |
| return interval_ticks % kTicksPerSecond; |
| } |
| |
| inline bool operator< (const DatetimeIntervalLit& rhs) const { |
| return interval_ticks < rhs.interval_ticks; |
| } |
| |
| inline bool operator> (const DatetimeIntervalLit& rhs) const { |
| return interval_ticks > rhs.interval_ticks; |
| } |
| |
| inline bool operator<=(const DatetimeIntervalLit& rhs) const { |
| return interval_ticks <= rhs.interval_ticks; |
| } |
| |
| inline bool operator>=(const DatetimeIntervalLit& rhs) const { |
| return interval_ticks >= rhs.interval_ticks; |
| } |
| |
| inline bool operator==(const DatetimeIntervalLit& rhs) const { |
| return interval_ticks == rhs.interval_ticks; |
| } |
| |
| inline bool operator!=(const DatetimeIntervalLit& rhs) const { |
| return interval_ticks != rhs.interval_ticks; |
| } |
| |
| inline DatetimeIntervalLit operator-() const { |
| DatetimeIntervalLit result; |
| result.interval_ticks = -interval_ticks; |
| return result; |
| } |
| |
| inline DatetimeIntervalLit& operator+=(const DatetimeIntervalLit& rhs) { |
| interval_ticks += rhs.interval_ticks; |
| return *this; |
| } |
| |
| inline DatetimeIntervalLit& operator-=(const DatetimeIntervalLit& rhs) { |
| interval_ticks -= rhs.interval_ticks; |
| return *this; |
| } |
| |
| template<typename NumericCppType> |
| inline DatetimeIntervalLit& operator*=(const NumericCppType rhs) { |
| interval_ticks *= rhs; |
| return *this; |
| } |
| |
| template<typename NumericCppType> |
| inline DatetimeIntervalLit& operator/=(const NumericCppType rhs) { |
| DCHECK_NE(rhs, 0); |
| interval_ticks /= rhs; |
| return *this; |
| } |
| }; |
| |
| /** |
| * @brief A literal representing the year-month interval. |
| **/ |
| struct YearMonthIntervalLit { |
| std::int64_t months; |
| |
| // The maximum number of characters needed to print out a DatetimeInterval in |
| // the "standard" format. |
| static constexpr int kPrintingChars |
| = 1 // Possible '-' prefix |
| + std::numeric_limits<std::int64_t>::digits10 // Year |
| + 7 // " years " |
| + 2 // Month |
| + 5; // " mons" |
| |
| inline bool operator< (const YearMonthIntervalLit& rhs) const { |
| return months < rhs.months; |
| } |
| |
| inline bool operator> (const YearMonthIntervalLit& rhs) const { |
| return months > rhs.months; |
| } |
| |
| inline bool operator<=(const YearMonthIntervalLit& rhs) const { |
| return months <= rhs.months; |
| } |
| |
| inline bool operator>=(const YearMonthIntervalLit& rhs) const { |
| return months >= rhs.months; |
| } |
| |
| inline bool operator==(const YearMonthIntervalLit& rhs) const { |
| return months == rhs.months; |
| } |
| |
| inline bool operator!=(const YearMonthIntervalLit& rhs) const { |
| return months != rhs.months; |
| } |
| |
| inline YearMonthIntervalLit operator-() const { |
| YearMonthIntervalLit result; |
| result.months = -months; |
| return result; |
| } |
| |
| inline YearMonthIntervalLit& operator+=(const YearMonthIntervalLit& rhs) { |
| months += rhs.months; |
| return *this; |
| } |
| |
| inline YearMonthIntervalLit& operator-=(const YearMonthIntervalLit& rhs) { |
| months -= rhs.months; |
| return *this; |
| } |
| |
| template<typename type> |
| inline YearMonthIntervalLit& operator*=(const type rhs) { |
| months *= rhs; |
| return *this; |
| } |
| |
| template<typename type> |
| inline YearMonthIntervalLit& operator/=(const type rhs) { |
| DCHECK_NE(rhs, 0); |
| months /= rhs; |
| return *this; |
| } |
| }; |
| |
| /** @} */ |
| |
| } // namespace quickstep |
| |
| #endif // QUICKSTEP_TYPES_INTERVAL_LIT_HPP_ |