📄 time_conversion_helper.hpp
字号:
/*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library http://www.boost.org/ Copyright (c) 2001-2008 Hartmut Kaiser. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)=============================================================================*/#if !defined(TIME_CONVERSION_HELPER_HPP_DA97E389_1797_43BA_82AE_B071064B3EF4_INCLUDED)#define TIME_CONVERSION_HELPER_HPP_DA97E389_1797_43BA_82AE_B071064B3EF4_INCLUDED#include <ctime>#include <cstring>#include <boost/config.hpp>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_symbols.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_push_back_actor.hpp>#if !defined(spirit_append_actor)#define spirit_append_actor(actor) boost::spirit::classic::push_back_a(actor)#define spirit_assign_actor(actor) boost::spirit::classic::assign_a(actor)#endif // !defined(spirit_append_actor)// this must occur after all of the includes and before any code appears#ifdef BOOST_HAS_ABI_HEADERS#include BOOST_ABI_PREFIX#endif///////////////////////////////////////////////////////////////////////////////namespace boost {namespace wave {namespace util {namespace time_conversion { using namespace std; // some systems have std::tm etc. in namespace std ///////////////////////////////////////////////////////////////////////////////// define, whether the rule's should generate some debug output#define TRACE_CPP_TIME_CONVERSION \ (BOOST_SPIRIT_DEBUG_FLAGS_CPP & BOOST_SPIRIT_DEBUG_FLAGS_TIME_CONVERSION) \ /**////////////////////////////////////////////////////////////////////////////////// Grammar for parsing a date/time string generated by the C++ compiler from// __DATE__ and __TIME__ class time_conversion_grammar : public boost::spirit::classic::grammar<time_conversion_grammar> { public: time_conversion_grammar() : fYearIsCorrected(false) { using namespace std; // some systems have memset in std memset (&time_stamp, 0, sizeof(tm)); BOOST_SPIRIT_DEBUG_TRACE_RULE_NAME(*this, "time_conversion_grammar", TRACE_CPP_TIME_CONVERSION); } template <typename ScannerT> struct definition { definition(time_conversion_grammar const &self) { using boost::spirit::classic::int_p; using boost::spirit::classic::add; char const *m[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; for (int i = 0; i < 12; ++i) add (month, m[i], i); time_rule // expected format is 'Dec 29 2001 11:23:59' = month[spirit_assign_actor(self.time_stamp.tm_mon)] >> int_p[spirit_assign_actor(self.time_stamp.tm_mday)] >> int_p[spirit_assign_actor(self.time_stamp.tm_year)] >> int_p[spirit_assign_actor(self.time_stamp.tm_hour)] >> ':' >> int_p[spirit_assign_actor(self.time_stamp.tm_min)] >> ':' >> int_p[spirit_assign_actor(self.time_stamp.tm_sec)] ; BOOST_SPIRIT_DEBUG_TRACE_RULE(time_rule, TRACE_CPP_TIME_CONVERSION); } boost::spirit::classic::rule<ScannerT> time_rule; boost::spirit::classic::symbols<> month; boost::spirit::classic::rule<ScannerT> const& start() const { return time_rule; } }; void correct_year() { if (!fYearIsCorrected) { time_stamp.tm_year -= 1900; fYearIsCorrected = true; } } mutable tm time_stamp; bool fYearIsCorrected; }; ///////////////////////////////////////////////////////////////////////////////// calculate the time of the compilation as a std::time_t to ensure correctness // of the saved dfa table class time_conversion_helper { public: time_conversion_helper(char const *act_time) : compile_time(0) { using namespace boost::spirit::classic; time_conversion_grammar g; parse_info<> pi = parse (act_time, g, space_p); if (pi.hit) { g.correct_year(); compile_time = mktime(&g.time_stamp); } BOOST_ASSERT(0 != compile_time); } time_t get_time() const { return compile_time; } private: time_t compile_time; };///////////////////////////////////////////////////////////////////////////////#undef TRACE_CPP_TIME_CONVERSION} // namespace time_conversion // import time_conversion into the boost::wave::util namespaceusing namespace time_conversion;///////////////////////////////////////////////////////////////////////////////} // namespace util} // namespace wave} // namespace boost// the suffix header occurs after all of the code#ifdef BOOST_HAS_ABI_HEADERS#include BOOST_ABI_SUFFIX#endif#endif // !defined(TIME_CONVERSION_HELPER_HPP_DA97E389_1797_43BA_82AE_B071064B3EF4_INCLUDED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -