mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 09:58:11 +00:00

Currently, the generated IPC decoders will default-construct the type to be decoded, then pass that value by reference to the concrete decoder. This, of course, requires that the type is default-constructible. This was an issue for decoding Variants, which had to require the first type in the Variant list is Empty, to ensure it is default constructible. Further, this made it possible for values to become uninitialized in user-defined decoders. This patch makes the decoder interface such that the concrete decoders themselves contruct the decoded type upon return from the decoder. To do so, the default decoders in IPC::Decoder had to be moved to the IPC namespace scope, as these decoders are now specializations instead of overloaded methods (C++ requires specializations to be in a namespace scope).
63 lines
1.6 KiB
C++
63 lines
1.6 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/DeprecatedString.h>
|
|
#include <AK/StringView.h>
|
|
#include <LibIPC/Forward.h>
|
|
#include <time.h>
|
|
|
|
namespace Core {
|
|
|
|
// Represents a time in local time.
|
|
class DateTime {
|
|
public:
|
|
time_t timestamp() const { return m_timestamp; }
|
|
|
|
unsigned year() const { return m_year; }
|
|
unsigned month() const { return m_month; }
|
|
unsigned day() const { return m_day; }
|
|
|
|
unsigned hour() const { return m_hour; }
|
|
unsigned minute() const { return m_minute; }
|
|
unsigned second() const { return m_second; }
|
|
unsigned weekday() const;
|
|
unsigned days_in_month() const;
|
|
unsigned day_of_year() const;
|
|
bool is_leap_year() const;
|
|
|
|
void set_time(int year, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);
|
|
DeprecatedString to_deprecated_string(StringView format = "%Y-%m-%d %H:%M:%S"sv) const;
|
|
|
|
static DateTime create(int year, int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0);
|
|
static DateTime now();
|
|
static DateTime from_timestamp(time_t);
|
|
static Optional<DateTime> parse(StringView format, DeprecatedString const& string);
|
|
|
|
bool operator<(DateTime const& other) const { return m_timestamp < other.m_timestamp; }
|
|
|
|
private:
|
|
time_t m_timestamp { 0 };
|
|
int m_year { 0 };
|
|
int m_month { 0 };
|
|
int m_day { 0 };
|
|
int m_hour { 0 };
|
|
int m_minute { 0 };
|
|
int m_second { 0 };
|
|
};
|
|
|
|
}
|
|
|
|
namespace IPC {
|
|
|
|
template<>
|
|
bool encode(Encoder&, Core::DateTime const&);
|
|
|
|
template<>
|
|
ErrorOr<Core::DateTime> decode(Decoder&);
|
|
|
|
}
|