File indexing completed on 2025-08-28 08:27:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #pragma once
0019
0020 #include <chrono>
0021 #include <memory>
0022 #include <utility>
0023
0024 #include "arrow/type_fwd.h"
0025 #include "arrow/util/visibility.h"
0026
0027 namespace arrow {
0028 namespace util {
0029
0030 enum DivideOrMultiply {
0031 MULTIPLY,
0032 DIVIDE,
0033 };
0034
0035 ARROW_EXPORT
0036 std::pair<DivideOrMultiply, int64_t> GetTimestampConversion(TimeUnit::type in_unit,
0037 TimeUnit::type out_unit);
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048 ARROW_EXPORT Result<int64_t> ConvertTimestampValue(const std::shared_ptr<DataType>& in,
0049 const std::shared_ptr<DataType>& out,
0050 int64_t value);
0051
0052 template <typename Visitor, typename... Args>
0053 decltype(std::declval<Visitor>()(std::chrono::seconds{}, std::declval<Args&&>()...))
0054 VisitDuration(TimeUnit::type unit, Visitor&& visitor, Args&&... args) {
0055 switch (unit) {
0056 default:
0057 case TimeUnit::SECOND:
0058 break;
0059 case TimeUnit::MILLI:
0060 return visitor(std::chrono::milliseconds{}, std::forward<Args>(args)...);
0061 case TimeUnit::MICRO:
0062 return visitor(std::chrono::microseconds{}, std::forward<Args>(args)...);
0063 case TimeUnit::NANO:
0064 return visitor(std::chrono::nanoseconds{}, std::forward<Args>(args)...);
0065 }
0066 return visitor(std::chrono::seconds{}, std::forward<Args>(args)...);
0067 }
0068
0069
0070 struct CastSecondsToUnitImpl {
0071 template <typename Duration>
0072 int64_t operator()(Duration, int64_t seconds) {
0073 auto duration = std::chrono::duration_cast<Duration>(std::chrono::seconds{seconds});
0074 return static_cast<int64_t>(duration.count());
0075 }
0076 };
0077
0078 inline int64_t CastSecondsToUnit(TimeUnit::type unit, int64_t seconds) {
0079 return VisitDuration(unit, CastSecondsToUnitImpl{}, seconds);
0080 }
0081
0082 }
0083 }