Export of internal Abseil changes
-- 6a60bc6c79a3069f49986c2567dd51d2792f8ec1 by Abseil Team <absl-team@google.com>: Internal cleanup PiperOrigin-RevId: 311210039 -- a1049de1dd9071efa3a3dda1c3f25ab578b23e27 by Laramie Leavitt <lar@google.com>: Internal change PiperOrigin-RevId: 311188627 -- c2ccddd1cd89ef9d79c35bbe9e1813164db27031 by Matt Kulukundis <kfm@google.com>: Migrate time parsing/formatting to string_view. - make a copy before handing to cctz but handle local cases without PiperOrigin-RevId: 311009254 -- d91d0cd68f3672a727ff76ee43f2da5226673d60 by Gennadiy Rozental <rogeeff@google.com>: Eliminate public method absl::Flag<T>::IsSpecfiedOnCommandLine. This interface was never intended to be supported. Prefer to react to the current value of flag. PiperOrigin-RevId: 310991916 -- 8ad41e7ec24f43598ed232545314117802e7895c by Gennadiy Rozental <rogeeff@google.com>: Internal change PiperOrigin-RevId: 310757743 -- f091f77a13ce9481218cb356f8b4ceb49c1530f9 by Jorg Brown <jorg@google.com>: Change #include of <iostream> to <iosfwd> from absl/strings/cord.h PiperOrigin-RevId: 310657413 -- 39419418af6be4ac9b9204ebe2c7a92a6c3a0bc9 by Derek Mauro <dmauro@google.com>: Internal change PiperOrigin-RevId: 310615554 GitOrigin-RevId: 6a60bc6c79a3069f49986c2567dd51d2792f8ec1 Change-Id: I57dd35424269d67740272c4f88b2de54d8022cb2
This commit is contained in:
parent
c45d1c09d5
commit
cbfd0f0fe5
18 changed files with 279 additions and 126 deletions
|
|
@ -13,9 +13,12 @@
|
|||
// limitations under the License.
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <cctype>
|
||||
#include <cstdint>
|
||||
|
||||
#include "absl/strings/match.h"
|
||||
#include "absl/strings/string_view.h"
|
||||
#include "absl/time/internal/cctz/include/cctz/time_zone.h"
|
||||
#include "absl/time/time.h"
|
||||
|
||||
|
|
@ -71,12 +74,12 @@ absl::Time Join(const cctz_parts& parts) {
|
|||
|
||||
} // namespace
|
||||
|
||||
std::string FormatTime(const std::string& format, absl::Time t,
|
||||
std::string FormatTime(absl::string_view format, absl::Time t,
|
||||
absl::TimeZone tz) {
|
||||
if (t == absl::InfiniteFuture()) return kInfiniteFutureStr;
|
||||
if (t == absl::InfinitePast()) return kInfinitePastStr;
|
||||
if (t == absl::InfiniteFuture()) return std::string(kInfiniteFutureStr);
|
||||
if (t == absl::InfinitePast()) return std::string(kInfinitePastStr);
|
||||
const auto parts = Split(t);
|
||||
return cctz::detail::format(format, parts.sec, parts.fem,
|
||||
return cctz::detail::format(std::string(format), parts.sec, parts.fem,
|
||||
cctz::time_zone(tz));
|
||||
}
|
||||
|
||||
|
|
@ -88,42 +91,50 @@ std::string FormatTime(absl::Time t) {
|
|||
return absl::FormatTime(RFC3339_full, t, absl::LocalTimeZone());
|
||||
}
|
||||
|
||||
bool ParseTime(const std::string& format, const std::string& input,
|
||||
bool ParseTime(absl::string_view format, absl::string_view input,
|
||||
absl::Time* time, std::string* err) {
|
||||
return absl::ParseTime(format, input, absl::UTCTimeZone(), time, err);
|
||||
}
|
||||
|
||||
// If the input string does not contain an explicit UTC offset, interpret
|
||||
// the fields with respect to the given TimeZone.
|
||||
bool ParseTime(const std::string& format, const std::string& input,
|
||||
bool ParseTime(absl::string_view format, absl::string_view input,
|
||||
absl::TimeZone tz, absl::Time* time, std::string* err) {
|
||||
const char* data = input.c_str();
|
||||
while (std::isspace(*data)) ++data;
|
||||
|
||||
size_t inf_size = strlen(kInfiniteFutureStr);
|
||||
if (strncmp(data, kInfiniteFutureStr, inf_size) == 0) {
|
||||
const char* new_data = data + inf_size;
|
||||
while (std::isspace(*new_data)) ++new_data;
|
||||
if (*new_data == '\0') {
|
||||
*time = InfiniteFuture();
|
||||
return true;
|
||||
auto strip_leading_space = [](absl::string_view* sv) {
|
||||
while (!sv->empty()) {
|
||||
if (!std::isspace(sv->front())) return;
|
||||
sv->remove_prefix(1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
inf_size = strlen(kInfinitePastStr);
|
||||
if (strncmp(data, kInfinitePastStr, inf_size) == 0) {
|
||||
const char* new_data = data + inf_size;
|
||||
while (std::isspace(*new_data)) ++new_data;
|
||||
if (*new_data == '\0') {
|
||||
*time = InfinitePast();
|
||||
return true;
|
||||
// Portable toolchains means we don't get nice constexpr here.
|
||||
struct Literal {
|
||||
const char* name;
|
||||
size_t size;
|
||||
absl::Time value;
|
||||
};
|
||||
static Literal literals[] = {
|
||||
{kInfiniteFutureStr, strlen(kInfiniteFutureStr), InfiniteFuture()},
|
||||
{kInfinitePastStr, strlen(kInfinitePastStr), InfinitePast()},
|
||||
};
|
||||
strip_leading_space(&input);
|
||||
for (const auto& lit : literals) {
|
||||
if (absl::StartsWith(input, absl::string_view(lit.name, lit.size))) {
|
||||
absl::string_view tail = input;
|
||||
tail.remove_prefix(lit.size);
|
||||
strip_leading_space(&tail);
|
||||
if (tail.empty()) {
|
||||
*time = lit.value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string error;
|
||||
cctz_parts parts;
|
||||
const bool b = cctz::detail::parse(format, input, cctz::time_zone(tz),
|
||||
&parts.sec, &parts.fem, &error);
|
||||
const bool b =
|
||||
cctz::detail::parse(std::string(format), std::string(input),
|
||||
cctz::time_zone(tz), &parts.sec, &parts.fem, &error);
|
||||
if (b) {
|
||||
*time = Join(parts);
|
||||
} else if (err != nullptr) {
|
||||
|
|
@ -134,8 +145,7 @@ bool ParseTime(const std::string& format, const std::string& input,
|
|||
|
||||
// Functions required to support absl::Time flags.
|
||||
bool AbslParseFlag(absl::string_view text, absl::Time* t, std::string* error) {
|
||||
return absl::ParseTime(RFC3339_full, std::string(text), absl::UTCTimeZone(),
|
||||
t, error);
|
||||
return absl::ParseTime(RFC3339_full, text, absl::UTCTimeZone(), t, error);
|
||||
}
|
||||
|
||||
std::string AbslUnparseFlag(absl::Time t) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue