Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

upd: Calendar.hppの大きいファイルの分割 #31

Merged
merged 4 commits into from
Jul 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions Library/PAX_SAPIENTICA/Calendar/Calendars.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/*##########################################################################################

PAX SAPIENTICA Library 💀🌿🌏

[Planning] 2023 As Project
[Production] 2023 As Project
[Contact Us] wanotaitei@gmail.com https://github.com/AsPJT/PAX_SAPIENTICA
[License] Distributed under the CC0 1.0. https://creativecommons.org/publicdomain/zero/1.0/

##########################################################################################*/

#ifndef PAX_SAPIENTICA_CALENDAR_CALENDARS_HPP
#define PAX_SAPIENTICA_CALENDAR_CALENDARS_HPP

/*##########################################################################################
Define a structure that handles the year, month, and day.
年月日を扱う構造体を定義する。
##########################################################################################*/

// TODO:改修必須

#include <cstddef>
#include <variant>

#include <PAX_SAPIENTICA/Calendar/Date.hpp>
#include <PAX_SAPIENTICA/Calendar/JulianDayNumber.hpp>

namespace paxs::cal {

// 暦
using Calendars = std::variant<
JDN_S32 // ユリウス通日 (S32)
, JDN_S64 // ユリウス通日 (S64)
, JDN_F64 // ユリウス通日 (F64)
, JulianDate // ユリウス暦
, GregorianDate // グレゴリオ暦
, IslamicDate // ヒジュラ暦
, JapanDate // 和暦
, CalBP // 較正年代
, SimulationSteps// シミュレーションのステップ数
>;

enum CalendarsType : std::size_t {
jdn_s32_type // ユリウス通日 (S32)
, jdn_s64_type // ユリウス通日 (S64)
, jdn_f64_type // ユリウス通日 (F64)
, julian_date_type // ユリウス暦
, gregorian_date_type// グレゴリオ暦
, islamic_date_type // ヒジュラ暦
, japan_date_type // 和暦
, calbp_type // 較正年代
, simulation_steps_type// シミュレーションのステップ数
};

}

#endif // !PAX_SAPIENTICA_CALENDAR_CALENDARS_HPP
199 changes: 177 additions & 22 deletions Library/PAX_SAPIENTICA/Calendar/Date.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,38 +13,193 @@
#define PAX_SAPIENTICA_CALENDAR_DATE_HPP

/*##########################################################################################
日付の構造体
Define a structure that handles the year, month, and day.
年月日を扱う構造体を定義する。
##########################################################################################*/

namespace paxs {
// TODO:改修必須

// 名年月日の暦
// 例:和暦、中国暦
template<typename N, typename Y, typename M, typename D>
struct Date3N {
N name{};
Y year{};
M month{};
D day{};
#include <cstdint>

namespace paxs::cal {

// 暦の出力形式
enum class DateOutputType {
name_and_ymd // 暦名 & 年月日(例:グレゴリオ暦1年1月1日)
,name_and_value // 暦名 & 値
};

// 年月日の暦
// 例:グレゴリオ暦、ユリウス暦
template<typename Y, typename M, typename D>
struct Date3 {
Y year{};
M month{};
D day{};
using DateGengo = std::int_least32_t;
using DateYear = std::int_least32_t;
using DateMonth = std::uint_least8_t;
using DateDay = std::uint_least8_t;
// シミュレーションのステップ数
class SimulationSteps {
private:
std::uint_least32_t day{ 0 };
public:
SimulationSteps() = default;
SimulationSteps(const std::uint_least32_t day_)
:day(day_) {}
constexpr void setGengo(const DateGengo) const {} // 何もしない( Variant に用いているため定義)
constexpr void setYear(const DateYear) const {} // 何もしない( Variant に用いているため定義)
constexpr void setMonth(const DateMonth) const {} // 何もしない( Variant に用いているため定義)
constexpr void setDay(const std::int_least32_t day_) { day = day_; }
constexpr void setLeapMonth(const bool) const {} // 何もしない( Variant に用いているため定義)
constexpr DateGengo getGengo() const { return 0; }
constexpr DateYear getYear() const { return 0; }
constexpr DateMonth getMonth() const { return 0; }
constexpr std::uint_least32_t& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return 0; }
constexpr DateYear cgetYear() const { return 0; }
constexpr DateMonth cgetMonth() const { return 0; }
constexpr std::uint_least32_t cgetDay() const { return day; }
constexpr static bool isLeapMonth() { return false; } // 閏月は必ず無い( Variant に用いているため定義)
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_value; } // 暦名&年月日形式( Variant に用いているため定義)
};
// 較正年代
class CalBP {
private:
std::int_least32_t day{};
public:
CalBP() = default;
CalBP(const std::int_least32_t day_)
:day(day_) {}
constexpr void setGengo(const DateGengo) const {} // 何もしない( Variant に用いているため定義)
constexpr void setYear(const DateYear) const {} // 何もしない( Variant に用いているため定義)
constexpr void setMonth(const DateMonth) const {} // 何もしない( Variant に用いているため定義)
constexpr void setDay(const std::int_least32_t day_) { day = day_; }
constexpr void setLeapMonth(const bool) const {} // 何もしない( Variant に用いているため定義)
constexpr DateGengo getGengo() const { return 0; }
constexpr DateYear getYear() const { return 0; }
constexpr DateMonth getMonth() const { return 0; }
constexpr std::int_least32_t& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return 0; }
constexpr DateYear cgetYear() const { return 0; }
constexpr DateMonth cgetMonth() const { return 0; }
constexpr std::int_least32_t cgetDay() const { return day; }
constexpr static bool isLeapMonth() { return false; } // 閏月は必ず無い( Variant に用いているため定義)
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_value; } // 暦名&年月日形式( Variant に用いているため定義)
};

// 日の暦
// 例:グレゴリオ暦、ユリウス暦
template<typename D>
struct Date1 {
D day{};
// 年月日
class IslamicDate {
private:
DateYear year{};
DateMonth month{};
DateDay day{};
public:
// ヒジュラ暦の日付から絶対年代(日付)を計算
constexpr operator int() const {
return (day + 29 * (month - 1) + month / 2
+ 354 * (year - 1) // 前年の閏日以外の日
+ (3 + (11 * year)) / 30 // 前年の閏日
+ 227014); // カレンダーの開始日の前日
}

IslamicDate() = default;
IslamicDate(const DateYear year_, const DateMonth month_, const DateDay day_)
:year(year_), month(month_), day(day_) {}
constexpr void setGengo(const DateGengo) const {} // 何もしない( Variant に用いているため定義)
constexpr void setYear(const DateYear year_) { year = year_; }
constexpr void setMonth(const DateMonth month_) { month = month_; }
constexpr void setDay(const DateDay day_) { day = day_; }
constexpr void setLeapMonth(const bool) const {} // 何もしない( Variant に用いているため定義)
constexpr DateGengo getGengo() const { return 0; }
constexpr DateYear& getYear() { return year; }
constexpr DateMonth& getMonth() { return month; }
constexpr DateDay& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return 0; }
constexpr DateYear cgetYear() const { return year; }
constexpr DateMonth cgetMonth() const { return month; }
constexpr DateDay cgetDay() const { return day; }
constexpr static bool isLeapMonth() { return false; } // 閏月は必ず無い( Variant に用いているため定義)
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_ymd; } // 暦名&年月日形式( Variant に用いているため定義)
};

// 年月日
class GregorianDate {
private:
DateYear year{};
DateMonth month{};
DateDay day{};
public:
GregorianDate() = default;
GregorianDate(const DateYear year_, const DateMonth month_, const DateDay day_)
:year(year_), month(month_), day(day_) {}
constexpr void setGengo(const DateGengo) const {} // 何もしない( Variant に用いているため定義)
constexpr void setYear(const DateYear year_) { year = year_; }
constexpr void setMonth(const DateMonth month_) { month = month_; }
constexpr void setDay(const DateDay day_) { day = day_; }
constexpr void setLeapMonth(const bool) const {} // 何もしない( Variant に用いているため定義)
constexpr DateGengo getGengo() const { return 0; }
constexpr DateYear& getYear() { return year; }
constexpr DateMonth& getMonth() { return month; }
constexpr DateDay& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return 0; }
constexpr DateYear cgetYear() const { return year; }
constexpr DateMonth cgetMonth() const { return month; }
constexpr DateDay cgetDay() const { return day; }
constexpr static bool isLeapMonth() { return false; } // 閏月は必ず無い( Variant に用いているため定義)
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_ymd; } // 暦名&年月日形式( Variant に用いているため定義)
};

// 年月日
class JulianDate {
private:
DateYear year{};
DateMonth month{};
DateDay day{};
public:
JulianDate() = default;
JulianDate(const DateYear year_, const DateMonth month_, const DateDay day_)
:year(year_), month(month_), day(day_) {}
constexpr void setGengo(const DateGengo) const {} // 何もしない( Variant に用いているため定義)
constexpr void setYear(const DateYear year_) { year = year_; }
constexpr void setMonth(const DateMonth month_) { month = month_; }
constexpr void setDay(const DateDay day_) { day = day_; }
constexpr void setLeapMonth(const bool) const {} // 何もしない( Variant に用いているため定義)
constexpr DateGengo getGengo() const { return 0; }
constexpr DateYear& getYear() { return year; }
constexpr DateMonth& getMonth() { return month; }
constexpr DateDay& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return 0; }
constexpr DateYear cgetYear() const { return year; }
constexpr DateMonth cgetMonth() const { return month; }
constexpr DateDay cgetDay() const { return day; }
constexpr static bool isLeapMonth() { return false; } // 閏月は必ず無い( Variant に用いているため定義)
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_ymd; } // 暦名&年月日形式( Variant に用いているため定義)
};


// 日本の年月日
class JapanDate {
private:
DateGengo gengo{};
DateYear year{};
DateMonth month{};
DateDay day{};
bool is_leap_month = false; // 閏月かどうか
public:
JapanDate() = default;
JapanDate(const DateGengo gengo_, const DateYear year_, const DateMonth month_, const DateDay day_, const bool is_leap_month_ = false)
:gengo(gengo_), year(year_), month(month_), day(day_), is_leap_month(is_leap_month_){}
constexpr void setGengo(const DateGengo gengo_) { gengo = gengo_; }
constexpr void setYear(const DateYear year_) { year = year_; }
constexpr void setMonth(const DateMonth month_) { month = month_; }
constexpr void setDay(const DateDay day_) { day = day_; }
constexpr void setLeapMonth(const bool leap_month_) { is_leap_month = leap_month_; }
constexpr DateGengo& getGengo() { return gengo; }
constexpr DateYear& getYear() { return year; }
constexpr DateMonth& getMonth() { return month; }
constexpr DateDay& getDay() { return day; }
constexpr DateGengo cgetGengo() const { return gengo; }
constexpr DateYear cgetYear() const { return year; }
constexpr DateMonth cgetMonth() const { return month; }
constexpr DateDay cgetDay() const { return day; }
constexpr bool isLeapMonth() const { return is_leap_month; }
constexpr static DateOutputType getDateOutputType() { return DateOutputType::name_and_ymd; } // 暦名&年月日形式( Variant に用いているため定義)
};

}

Expand Down
Loading