time_tag.hpp #1

  • //
  • guest/
  • ShadauxCat/
  • Sprawl/
  • Mainline/
  • tag/
  • time_tag.hpp
  • View
  • Commits
  • Open Download .zip Download (3 KB)
#pragma once

#include "tag.hpp"

namespace sprawl
{
	namespace detail
	{
		namespace time
		{
			static constexpr int64_t EraFromYear(int64_t year)
			{
				return (year >= 0 ? year : year - 399) / 400;
			}

			static constexpr int64_t YearOfEra(int64_t year, int64_t era)
			{
				return year - era * 400;
			}

			static constexpr int64_t DayOfYear(int64_t day, int64_t month)
			{
				return (153 * (month + (month > 2 ? -3 : 9)) + 2) / 5 + day - 1;
			}

			static constexpr int64_t DayOfEra(int64_t yearOfEra, int64_t dayOfYear)
			{
				return yearOfEra * 365 + yearOfEra / 4 - yearOfEra / 100 + dayOfYear;
			}

			static constexpr int64_t DaysFromAdjustedCivil(int64_t year, int64_t month, int64_t day)
			{
				return EraFromYear(year) * 146097 + DayOfEra(YearOfEra(year, EraFromYear(year)), DayOfYear(day, month)) - 719468;
			}

			static constexpr int64_t DaysFromCivil(int64_t year, int64_t month, int64_t day)
			{
				return DaysFromAdjustedCivil(year - int64_t(month <= 2), month, day);
			}

			template<typename t_TagType> struct numericMonth_;
			template<> struct numericMonth_<SPRAWL_TAG("Jan")> { static constexpr int64_t value = 1; };
			template<> struct numericMonth_<SPRAWL_TAG("Feb")> { static constexpr int64_t value = 2; };
			template<> struct numericMonth_<SPRAWL_TAG("Mar")> { static constexpr int64_t value = 3; };
			template<> struct numericMonth_<SPRAWL_TAG("Apr")> { static constexpr int64_t value = 4; };
			template<> struct numericMonth_<SPRAWL_TAG("May")> { static constexpr int64_t value = 5; };
			template<> struct numericMonth_<SPRAWL_TAG("Jun")> { static constexpr int64_t value = 6; };
			template<> struct numericMonth_<SPRAWL_TAG("Jul")> { static constexpr int64_t value = 7; };
			template<> struct numericMonth_<SPRAWL_TAG("Aug")> { static constexpr int64_t value = 8; };
			template<> struct numericMonth_<SPRAWL_TAG("Sep")> { static constexpr int64_t value = 9; };
			template<> struct numericMonth_<SPRAWL_TAG("Oct")> { static constexpr int64_t value = 10; };
			template<> struct numericMonth_<SPRAWL_TAG("Nov")> { static constexpr int64_t value = 11; };
			template<> struct numericMonth_<SPRAWL_TAG("Dec")> { static constexpr int64_t value = 12; };
		}

		template<typename t_UnimplementedType>
		struct TagToDateTime;

		template<typename t_MonthTagType, typename t_DayTagType, typename t_YearTagType, typename t_HoursTagType, typename t_MinutesTagType, typename t_SecondsTagType>
		struct TagToDateTime<sprawl::TypeList<t_MonthTagType, t_DayTagType, t_YearTagType, t_HoursTagType, t_MinutesTagType, t_SecondsTagType>>
		{
			static constexpr int64_t value =
				t_SecondsTagType::template As<int64_t>()
				+ t_MinutesTagType::template As<int64_t>() * 60
				+ t_HoursTagType::template As<int64_t>() * 60 * 60
				+ time::DaysFromCivil(t_YearTagType::template As<int64_t>(), time::numericMonth_<t_MonthTagType>::value, t_DayTagType::template As<int64_t>()) * 24 * 60 * 60;
		};

		template<ssize_t t_Len, char t_FirstChar, char... t_MoreChars>
		struct TagToDateTime<sprawl::Tag<t_Len, t_FirstChar, t_MoreChars...>>
		{
			typedef sprawl::Tag<t_Len, t_FirstChar, t_MoreChars...> TagType;
			static constexpr int64_t value = TagToDateTime<typename TagType::template Replace<SPRAWL_TAG("  "), SPRAWL_TAG(" ")>::template Replace<SPRAWL_TAG(":"), SPRAWL_TAG(" ")>::template Split<SPRAWL_TAG(" ")>>::value;
		};
	}

	typedef SPRAWL_TAG(__DATE__ " " __TIME__) COMPILE_DATE_TIME_TAG;
	constexpr int64_t compileTimestamp = detail::TagToDateTime<COMPILE_DATE_TIME_TAG>::value;
}
# Change User Description Committed
#1 19906 ShadauxCat - Added tag, compile time string type
- Since tag requires visual studio 2015, removed compatibility code for earlier versions of visual studio
- Improved compiler detection
- Added endianness detection
- Added template if/else helper
- Fixed bug with murmur3 64 bit
- Added seed argument for murmur3

#review-19907