diff options
author | vng <viktor.govako@gmail.com> | 2014-10-16 15:59:17 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 02:30:54 +0300 |
commit | 3ab59b8840936724e808b9a23f04458483e033e6 (patch) | |
tree | 545d86701f3fd7ba897f1a70f4f8e599c2734fed /std | |
parent | 5befb68da6c30cb2b75e10b2606d6db70b3bcaf8 (diff) |
[linux] Added get_time function.
Diffstat (limited to 'std')
-rw-r--r-- | std/iomanip.hpp | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/std/iomanip.hpp b/std/iomanip.hpp index b24867e6f0..d62fdb85d8 100644 --- a/std/iomanip.hpp +++ b/std/iomanip.hpp @@ -1,5 +1,6 @@ #pragma once #include "common_defines.hpp" +#include "target_os.hpp" #ifdef new #undef new @@ -11,8 +12,64 @@ using std::setfill; using std::hex; using std::fixed; using std::setprecision; + + +#ifndef OMIM_OS_LINUX using std::get_time; +#else +#include <cassert> + +namespace detail +{ + template <class _CharT> struct get_time_manip + { + tm* __tm_; + const _CharT* __fmt_; + + get_time_manip(tm* __tm, const _CharT* __fmt) + : __tm_(__tm), __fmt_(__fmt) {} + }; + + template <class _CharT, class _Traits> + class stream_buf_impl : public std::basic_streambuf<_CharT, _Traits> + { + typedef std::basic_streambuf<_CharT, _Traits> base_t; + public: + bool parse(const get_time_manip<_CharT>& __x) + { + // Workaround works only for a stream buffer under null-terminated string. + assert(*base_t::egptr() == 0); + + char * res = ::strptime(base_t::gptr(), __x.__fmt_, __x.__tm_); + if (res == 0) + return false; + else + { + base_t::setg(base_t::eback(), res, base_t::egptr()); + return true; + } + } + }; + + template <class _CharT, class _Traits> + std::basic_istream<_CharT, _Traits>& + operator>>(std::basic_istream<_CharT, _Traits>& __is, const get_time_manip<_CharT>& __x) + { + if (!reinterpret_cast<stream_buf_impl<_CharT, _Traits>*>(__is.rdbuf())->parse(__x)) + __is.setstate(std::ios_base::failbit); + return __is; + } +} + +template <class _CharT> +detail::get_time_manip<_CharT> get_time(tm* __tm, const _CharT* __fmt) +{ + return detail::get_time_manip<_CharT>(__tm, __fmt); +} + +#endif + #ifdef DEBUG_NEW #define new DEBUG_NEW #endif |