You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
425 lines
13 KiB
425 lines
13 KiB
5 years ago
|
/***************************************************************************
|
||
|
*
|
||
|
* _time.h - Definitions of the time facets
|
||
|
*
|
||
|
* This is an internal header file used to implement the C++ Standard
|
||
|
* Library. It should never be #included directly by a program.
|
||
|
*
|
||
|
* $Id: _time.h 172106 2011-11-02 17:04:12Z statham $
|
||
|
*
|
||
|
***************************************************************************
|
||
|
*
|
||
|
* Copyright (c) 1994-2001 Rogue Wave Software, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* This computer software is owned by Rogue Wave Software, Inc. and is
|
||
|
* protected by U.S. copyright laws and other laws and by international
|
||
|
* treaties. This computer software is furnished by Rogue Wave Software,
|
||
|
* Inc. pursuant to a written license agreement and may be used, copied,
|
||
|
* transmitted, and stored only in accordance with the terms of such
|
||
|
* license and with the inclusion of the above copyright notice. This
|
||
|
* computer software or any other copies thereof may not be provided or
|
||
|
* otherwise made available to any other person.
|
||
|
*
|
||
|
* U.S. Government Restricted Rights. This computer software is provided
|
||
|
* with Restricted Rights. Use, duplication, or disclosure by the
|
||
|
* Government is subject to restrictions as set forth in subparagraph (c)
|
||
|
* (1) (ii) of The Rights in Technical Data and Computer Software clause
|
||
|
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
|
||
|
* Commercial Computer Software--Restricted Rights at 48 CFR 52.227-19,
|
||
|
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
|
||
|
* Flatiron Parkway, Boulder, Colorado 80301 USA.
|
||
|
*
|
||
|
**************************************************************************/
|
||
|
|
||
|
#ifndef _RWSTD_TIME_H_INCLUDED
|
||
|
#define _RWSTD_TIME_H_INCLUDED
|
||
|
|
||
|
#include <streambuf>
|
||
|
|
||
|
#include <rw/_punct.h>
|
||
|
#include <rw/_locale.h>
|
||
|
#include <rw/_defs.h>
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_BEGIN(std)
|
||
|
|
||
|
// 22.2.5.1
|
||
|
struct _RWSTD_EXPORT time_base
|
||
|
{
|
||
|
enum dateorder { no_order, dmy, mdy, ymd, ydm };
|
||
|
};
|
||
|
|
||
|
_RWSTD_NAMESPACE_END // std
|
||
|
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_BEGIN (__rw)
|
||
|
|
||
|
_USING (_RWSTD_C::size_t);
|
||
|
|
||
|
// -------------------------------------------------------------------------
|
||
|
// Implementation class template -- __rw_time_reader<_CharT, _InputIterator>.
|
||
|
// -------------------------------------------------------------------------
|
||
|
|
||
|
template <class _CharT, class _InputIterator>
|
||
|
class _RWSTD_EXPORT __rw_time_reader
|
||
|
: public __rw_digit_reader<_CharT, _InputIterator>
|
||
|
{
|
||
|
public:
|
||
|
typedef _TYPENAME __rw_timepunct<_CharT>::string_type string_type;
|
||
|
const __rw_timepunct<_CharT> &_C_timp;
|
||
|
|
||
|
__rw_time_reader (_InputIterator &__in, _InputIterator &__end,
|
||
|
_STD::ios_base &__io,
|
||
|
const __rw_timepunct<_CharT> &__tpunct)
|
||
|
: __rw_digit_reader<_CharT, _InputIterator>(__in, __end, __io),
|
||
|
_C_timp (__tpunct) {
|
||
|
|
||
|
// Don't recognize signs on any numeric input.
|
||
|
this->_C_state &= ~this->_C_signed;
|
||
|
}
|
||
|
|
||
|
bool _C_get_time_pattern (const string_type&, tm *);
|
||
|
};
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
__rw_time_reader<char,
|
||
|
_STD::istreambuf_iterator<char, _STD::char_traits<char> > >);
|
||
|
|
||
|
#ifndef _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
__rw_time_reader<wchar_t,
|
||
|
_STD::istreambuf_iterator<wchar_t, _STD::char_traits<wchar_t> > >);
|
||
|
|
||
|
#endif // _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_END //__rw
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_BEGIN (std)
|
||
|
|
||
|
// 22.2.5.1
|
||
|
template <class _CharT,
|
||
|
class _InputIterator _RWSTD_COMPLEX_DEFAULT (istreambuf_iterator<_CharT>) >
|
||
|
class time_get: public locale::facet, public time_base
|
||
|
{
|
||
|
public:
|
||
|
typedef _CharT char_type;
|
||
|
typedef _InputIterator iter_type;
|
||
|
typedef time_get<char_type, iter_type> time_get_type;
|
||
|
|
||
|
_EXPLICIT time_get (size_t __refs = 0)
|
||
|
: locale::facet (__refs, locale::time), _C_timp (0)
|
||
|
{ ; }
|
||
|
|
||
|
dateorder date_order() const {
|
||
|
return do_date_order();
|
||
|
}
|
||
|
|
||
|
iter_type get_time (iter_type __start, iter_type __end, ios_base& __fmat,
|
||
|
ios_base::iostate &__err, tm* __time) const {
|
||
|
return do_get_time (__start, __end, __fmat, __err, __time);
|
||
|
}
|
||
|
|
||
|
iter_type get_date (iter_type __start, iter_type __end, ios_base& __fmat,
|
||
|
ios_base::iostate &__err, tm* __time) const {
|
||
|
return do_get_date(__start, __end, __fmat, __err, __time);
|
||
|
}
|
||
|
|
||
|
iter_type get_weekday (iter_type __start, iter_type __end,
|
||
|
ios_base& __fmat,
|
||
|
ios_base::iostate &__err, tm* __time) const {
|
||
|
return do_get_weekday(__start, __end, __fmat, __err, __time);
|
||
|
}
|
||
|
|
||
|
iter_type get_monthname (iter_type __start, iter_type __end,
|
||
|
ios_base& __fmat,
|
||
|
ios_base::iostate &__err, tm* __time) const {
|
||
|
return do_get_monthname(__start, __end, __fmat, __err, __time);
|
||
|
}
|
||
|
|
||
|
iter_type get_year (iter_type __start, iter_type __end, ios_base& __fmat,
|
||
|
ios_base::iostate &__err, tm* __time) const {
|
||
|
return do_get_year(__start, __end, __fmat, __err, __time);
|
||
|
}
|
||
|
|
||
|
static locale::id id;
|
||
|
|
||
|
// Implementation:
|
||
|
enum { _C_facet_cat = locale::time, _C_ok_implicit = 1 };
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual dateorder do_date_order() const;
|
||
|
|
||
|
virtual iter_type do_get_time (iter_type, iter_type, ios_base&,
|
||
|
ios_base::iostate&, tm*) const;
|
||
|
virtual iter_type do_get_date (iter_type, iter_type, ios_base&,
|
||
|
ios_base::iostate&, tm*) const;
|
||
|
virtual iter_type do_get_weekday (iter_type, iter_type, ios_base&,
|
||
|
ios_base::iostate&, tm*) const;
|
||
|
virtual iter_type do_get_monthname (iter_type, iter_type, ios_base&,
|
||
|
ios_base::iostate&, tm*) const;
|
||
|
virtual iter_type do_get_year (iter_type, iter_type, ios_base&,
|
||
|
ios_base::iostate&, tm*) const;
|
||
|
|
||
|
// Implementation:
|
||
|
|
||
|
protected:
|
||
|
const _RW::__rw_timepunct<char_type>* _C_timp;
|
||
|
string _C_name;
|
||
|
|
||
|
private:
|
||
|
void _C_check_init () const {
|
||
|
if (!_C_timp)
|
||
|
_RWSTD_CONST_CAST (time_get_type*,
|
||
|
this)->_C_initfacet (locale ());
|
||
|
}
|
||
|
|
||
|
virtual void _C_initfacet (const locale &__loc);
|
||
|
|
||
|
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
|
||
|
locale::id &_C_get_id (void) const { return id; }
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
|
||
|
template <class _CharT, class _InputIterator>
|
||
|
void time_get<_CharT, _InputIterator>::_C_initfacet (const locale &__loc)
|
||
|
{
|
||
|
_RW::__rw_use_c_lib_locale __cloc (_C_name.c_str(), LC_TIME);
|
||
|
|
||
|
// bypass the mutex in std::use_facet<>() by directly calling
|
||
|
// the implementation locale member function to prevent a deadlock
|
||
|
|
||
|
typedef _RW::__rw_timepunct<char_type> _TimePunct;
|
||
|
typedef _RW::__rw_facet_maker<_TimePunct> _FacetMaker;
|
||
|
|
||
|
const locale::facet& __facet =
|
||
|
__loc._C_unsafe_use_facet (_TimePunct::id, _TimePunct::_C_ok_implicit,
|
||
|
_TimePunct::_C_facet_cat,
|
||
|
_FacetMaker::_C_maker_func);
|
||
|
|
||
|
_C_timp = _RWSTD_STATIC_CAST (const _TimePunct*, &__facet);
|
||
|
}
|
||
|
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
time_get<char, istreambuf_iterator<char, char_traits<char> > >);
|
||
|
|
||
|
#ifndef _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
time_get<wchar_t,
|
||
|
istreambuf_iterator<wchar_t, char_traits<wchar_t> > >);
|
||
|
|
||
|
#endif // _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
|
||
|
// 22.2.5.2
|
||
|
template <class _CharT,
|
||
|
class _InputIterator _RWSTD_COMPLEX_DEFAULT (istreambuf_iterator<_CharT>) >
|
||
|
class time_get_byname: public time_get<_CharT, _InputIterator>
|
||
|
{
|
||
|
public:
|
||
|
_EXPLICIT time_get_byname (const char *__name, size_t __refs = 0)
|
||
|
: time_get<_CharT, _InputIterator>(__refs) {
|
||
|
this->_C_name = __name;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
// 22.2.5.3
|
||
|
template <class _CharT,
|
||
|
class _OutputIterator _RWSTD_COMPLEX_DEFAULT (ostreambuf_iterator<_CharT>) >
|
||
|
class time_put: public locale::facet
|
||
|
{
|
||
|
public:
|
||
|
typedef _CharT char_type;
|
||
|
typedef _OutputIterator iter_type;
|
||
|
typedef time_put<char_type, iter_type> time_put_type;
|
||
|
|
||
|
_EXPLICIT time_put (size_t __refs = 0)
|
||
|
: locale::facet (__refs, locale::time), _C_timp (0)
|
||
|
{ }
|
||
|
|
||
|
iter_type put (iter_type, ios_base&, char_type, const tm*,
|
||
|
const char_type*, const char_type*) const;
|
||
|
|
||
|
iter_type put (iter_type __start, ios_base& __fmat, char_type __fill,
|
||
|
const tm* __time, char __fmt, char __modifier = 0) const {
|
||
|
return do_put (__start, __fmat, __fill, __time, __fmt, __modifier);
|
||
|
}
|
||
|
|
||
|
static locale::id id;
|
||
|
|
||
|
// Implementation:
|
||
|
enum { _C_facet_cat = locale::time, _C_ok_implicit = 1 };
|
||
|
|
||
|
protected:
|
||
|
|
||
|
virtual iter_type do_put (iter_type, ios_base&, char_type, const tm*,
|
||
|
char, char) const;
|
||
|
|
||
|
protected:
|
||
|
const _RW::__rw_timepunct<char_type>* _C_timp;
|
||
|
string _C_name;
|
||
|
|
||
|
private:
|
||
|
|
||
|
void _C_check_init () const {
|
||
|
if (!_C_timp)
|
||
|
_RWSTD_CONST_CAST (time_put_type*,
|
||
|
this)->_C_initfacet (locale ());
|
||
|
}
|
||
|
|
||
|
virtual void _C_initfacet (const locale &__loc);
|
||
|
|
||
|
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
|
||
|
locale::id &_C_get_id (void) const { return id; }
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
|
||
|
template <class _CharT, class _InputIterator>
|
||
|
void time_put<_CharT, _InputIterator>::_C_initfacet (const locale &__loc)
|
||
|
{
|
||
|
_RW::__rw_use_c_lib_locale __cloc (_C_name.c_str(), LC_TIME);
|
||
|
|
||
|
// bypass the mutex in std::use_facet<>() by directly calling
|
||
|
// the implementation locale member function to prevent a deadlock
|
||
|
|
||
|
typedef _RW::__rw_timepunct<char_type> _TimePunct;
|
||
|
typedef _RW::__rw_facet_maker<_TimePunct> _FacetMaker;
|
||
|
|
||
|
const locale::facet &__facet =
|
||
|
__loc._C_unsafe_use_facet (_TimePunct::id, _TimePunct::_C_ok_implicit,
|
||
|
_TimePunct::_C_facet_cat,
|
||
|
_FacetMaker::_C_maker_func);
|
||
|
|
||
|
_C_timp = _RWSTD_STATIC_CAST (const _TimePunct*, &__facet);
|
||
|
}
|
||
|
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
time_put<char, ostreambuf_iterator<char, char_traits<char> > >);
|
||
|
|
||
|
#ifndef _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
_RWSTD_INSTANTIATE_3 (
|
||
|
class _RWSTD_EXPORT
|
||
|
time_put<wchar_t,
|
||
|
ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >);
|
||
|
|
||
|
#endif // _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
|
||
|
// 22.2.5.4
|
||
|
template <class _CharT,
|
||
|
class _OutputIterator _RWSTD_COMPLEX_DEFAULT (ostreambuf_iterator<_CharT>) >
|
||
|
class time_put_byname: public time_put<_CharT, _OutputIterator>
|
||
|
{
|
||
|
public:
|
||
|
_EXPLICIT time_put_byname (const char *__name, size_t __refs = 0)
|
||
|
: time_put<_CharT, _OutputIterator>(__refs) {
|
||
|
this->_C_name = __name;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
_RWSTD_NAMESPACE_END // std
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_BEGIN (__rw)
|
||
|
|
||
|
|
||
|
#ifndef _RWSTD_NO_FUNC_PARTIAL_SPEC
|
||
|
|
||
|
template <class _CharT, class _InputIterator>
|
||
|
inline _STD::time_get<_CharT, _InputIterator>*
|
||
|
__rw_create_named_facet (_STD::time_get<_CharT, _InputIterator>*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new _STD::time_get_byname<_CharT, _InputIterator>(__name, __refs);
|
||
|
}
|
||
|
|
||
|
|
||
|
template <class _CharT, class _OutputIterator>
|
||
|
inline _STD::time_put<_CharT, _OutputIterator>*
|
||
|
__rw_create_named_facet (_STD::time_put<_CharT, _OutputIterator>*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new _STD::time_put_byname<_CharT, _OutputIterator>(__name, __refs);
|
||
|
}
|
||
|
|
||
|
|
||
|
#else // _RWSTD_NO_FUNC_PARTIAL_SPEC
|
||
|
|
||
|
|
||
|
#define _RWSTD_TIME(which, buf, _CharT) \
|
||
|
_STD::which <_CharT, _STD::buf##_iterator <_CharT, _STD::char_traits<_CharT> > >
|
||
|
|
||
|
_RWSTD_SPECIALIZED_FUNCTION
|
||
|
inline _RWSTD_TIME (time_get, istreambuf, char)*
|
||
|
__rw_create_named_facet (_RWSTD_TIME (time_get, istreambuf, char)*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new _RWSTD_TIME (time_get_byname, istreambuf, char)(__name, __refs);
|
||
|
}
|
||
|
|
||
|
|
||
|
_RWSTD_SPECIALIZED_FUNCTION
|
||
|
inline _RWSTD_TIME (time_put, ostreambuf, char)*
|
||
|
__rw_create_named_facet (_RWSTD_TIME (time_put, ostreambuf, char)*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new _RWSTD_TIME (time_put_byname, ostreambuf, char)(__name, __refs);
|
||
|
}
|
||
|
|
||
|
|
||
|
#ifndef _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
_RWSTD_SPECIALIZED_FUNCTION
|
||
|
inline _RWSTD_TIME (time_get, istreambuf, wchar_t)*
|
||
|
__rw_create_named_facet (_RWSTD_TIME (time_get, istreambuf, wchar_t)*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new
|
||
|
_RWSTD_TIME (time_get_byname, istreambuf, wchar_t)(__name, __refs);
|
||
|
}
|
||
|
|
||
|
|
||
|
_RWSTD_SPECIALIZED_FUNCTION
|
||
|
inline _RWSTD_TIME (time_put, ostreambuf, wchar_t)*
|
||
|
__rw_create_named_facet (_RWSTD_TIME (time_put, ostreambuf, wchar_t)*,
|
||
|
const char *__name, size_t __refs)
|
||
|
{
|
||
|
return new
|
||
|
_RWSTD_TIME (time_put_byname, ostreambuf, wchar_t)(__name, __refs);
|
||
|
}
|
||
|
|
||
|
#undef _RWSTD_TIME
|
||
|
|
||
|
|
||
|
#endif // _RWSTD_NO_WCHAR_T
|
||
|
|
||
|
#endif // _RWSTD_NO_FUNC_PARTIAL_SPEC
|
||
|
|
||
|
|
||
|
_RWSTD_NAMESPACE_END // __rw
|
||
|
|
||
|
|
||
|
#if _RWSTD_DEFINE_TEMPLATE (TIME)
|
||
|
# include <rw/_time.cc>
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif // _RWSTD_TIME_H_INCLUDED
|
||
|
|