blob: 8b1ae28b1b42c0be30d1868eb1d1d197802488f6 [file] [log] [blame]
/**
* 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_