📄 xlocnum
字号:
// xlocnum internal header (from <locale>)
#pragma once
#ifndef _XLOCNUM_
#define _XLOCNUM_
#ifndef RC_INVOKED
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <streambuf>
#pragma pack(push,_CRT_PACKING)
#pragma warning(push,3)
#pragma push_macro("new")
#undef new
#pragma warning(disable: 4189 4275)
// TEXT-TO-NUMERIC CONVERSION FUNCTIONS
_C_STD_BEGIN
#if !defined(MRTDLL) && !defined(_M_CEE_PURE)
_C_LIB_DECL
#endif /* !defined(MRTDLL) etc. */
extern _CRTIMP2_PURE float __CLRCALL_PURE_OR_CDECL _Stofx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
long, int *);
extern _CRTIMP2_PURE double __CLRCALL_PURE_OR_CDECL _Stodx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
long, int *);
extern _CRTIMP2_PURE long double __CLRCALL_PURE_OR_CDECL _Stoldx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
long, int *);
extern _CRTIMP2_PURE long __CLRCALL_PURE_OR_CDECL _Stolx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
int, int *);
extern _CRTIMP2_PURE unsigned long __CLRCALL_PURE_OR_CDECL _Stoulx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
int, int *);
extern _CRTIMP2_PURE _LONGLONG __CLRCALL_PURE_OR_CDECL _Stollx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
int, int *);
extern _CRTIMP2_PURE _ULONGLONG __CLRCALL_PURE_OR_CDECL _Stoullx(const char *,
_Out_opt_ _Deref_post_opt_valid_ char **,
int, int *);
#if !defined(MRTDLL) && !defined(_M_CEE_PURE)
_END_C_LIB_DECL
#endif /* !defined(MRTDLL) etc. */
_C_STD_END
_STD_BEGIN
// TEMPLATE CLASS numpunct
template<class _Elem>
class numpunct
: public locale::facet
{ // facet for defining numeric punctuation text
public:
typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
string_type;
typedef _Elem char_type;
__PURE_APPDOMAIN_GLOBAL _CRTIMP2_PURE static locale::id id; // unique facet id
_Elem decimal_point() const
{ // return decimal point
return (do_decimal_point());
}
_Elem thousands_sep() const
{ // return thousands separator
return (do_thousands_sep());
}
string grouping() const
{ // return grouping string
return (do_grouping());
}
string_type falsename() const
{ // return name for false
return (do_falsename());
}
string_type truename() const
{ // return name for true
return (do_truename());
}
explicit numpunct(size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
if (_Kseparator == 0)
_Kseparator = // NB: differs from "C" locale
_MAKLOCCHR(_Elem, ',', _Lobj._Getcvt());
_END_LOCINFO()
}
numpunct(const _Locinfo& _Lobj, size_t _Refs = 0, bool _Isdef = false)
: locale::facet(_Refs)
{ // construct from specified locale
_Init(_Lobj, _Isdef);
}
static size_t _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT numpunct<_Elem>(
_Locinfo(_Ploc->c_str()), 0, true);
return (_X_NUMERIC);
}
protected:
virtual __CLR_OR_THIS_CALL ~numpunct()
{ // destroy the object
_Tidy();
}
numpunct(const char *_Locname, size_t _Refs = 0, bool _Isdef = false)
: locale::facet(_Refs)
{ // construct from specified locale
_BEGIN_LOCINFO(_Lobj(_Locname))
_Init(_Lobj, _Isdef);
_END_LOCINFO()
}
void _Init(const _Locinfo& _Lobj, bool _Isdef = false)
{ // initialize from _Lobj
const lconv *_Ptr = _Lobj._Getlconv();
_Grouping = 0;
_Falsename = 0;
_Truename = 0;
_TRY_BEGIN
_Grouping = _MAKLOCSTR(char, _Isdef ? "" : _Ptr->grouping,
_Lobj._Getcvt());
_Falsename = _MAKLOCSTR(_Elem, _Lobj._Getfalse(), _Lobj._Getcvt());
_Truename = _MAKLOCSTR(_Elem, _Lobj._Gettrue(), _Lobj._Getcvt());
_CATCH_ALL
_Tidy();
_RERAISE;
_CATCH_END
_Dp = _MAKLOCCHR(_Elem, _Ptr->decimal_point[0], _Lobj._Getcvt());
_Kseparator =
_MAKLOCCHR(_Elem, _Ptr->thousands_sep[0], _Lobj._Getcvt());
if (_Isdef)
{ // apply defaults for required facets
// _Grouping = _MAKLOCSTR(char, "", _Lobj._Getcvt());
_Dp = _MAKLOCCHR(_Elem, '.', _Lobj._Getcvt());
_Kseparator = _MAKLOCCHR(_Elem, ',', _Lobj._Getcvt());
}
}
virtual _Elem __CLR_OR_THIS_CALL do_decimal_point() const
{ // return decimal point
return (_Dp);
}
virtual _Elem __CLR_OR_THIS_CALL do_thousands_sep() const
{ // return thousands separator
return (_Kseparator);
}
virtual string __CLR_OR_THIS_CALL do_grouping() const
{ // return grouping string
return (string(_Grouping));
}
virtual string_type __CLR_OR_THIS_CALL do_falsename() const
{ // return name for false
return (string_type(_Falsename));
}
virtual string_type __CLR_OR_THIS_CALL do_truename() const
{ // return name for true
return (string_type(_Truename));
}
private:
void _Tidy()
{ // free all storage
_DELETE_CRT_VEC((void *)_Grouping);
_DELETE_CRT_VEC((void *)_Falsename);
_DELETE_CRT_VEC((void *)_Truename);
}
const char *_Grouping; // grouping string, "" for "C" locale
_Elem _Dp; // decimal point, '.' for "C" locale
_Elem _Kseparator; // thousands separator, '\0' for "C" locale
const _Elem *_Falsename; // name for false, "false" for "C" locale
const _Elem *_Truename; // name for true, "true" for "C" locale
};
// TEMPLATE CLASS numpunct_byname
template<class _Elem>
class numpunct_byname
: public numpunct<_Elem>
{ // numpunct for named locale
public:
explicit numpunct_byname(const char *_Locname, size_t _Refs = 0)
: numpunct<_Elem>(_Locname, _Refs)
{ // construct for named locale
}
#if _HAS_CPP0X
explicit numpunct_byname(const string& _Str, size_t _Refs = 0)
: numpunct<_Elem>(_Str.c_str(), _Refs)
{ // construct for named locale
}
#endif /* _HAS_CPP0X */
protected:
virtual __CLR_OR_THIS_CALL ~numpunct_byname()
{ // destroy the object
}
};
// STATIC numpunct::id OBJECT
template<class _Elem>
__PURE_APPDOMAIN_GLOBAL locale::id numpunct<_Elem>::id;
// TEMPLATE CLASS num_get
template<class _Elem,
class _InIt = istreambuf_iterator<_Elem, char_traits<_Elem> > >
class num_get
: public locale::facet
{ // facet for converting text to encoded numbers
public:
typedef numpunct<_Elem> _Mypunct;
typedef basic_string<_Elem, char_traits<_Elem>, allocator<_Elem> >
_Mystr;
static size_t __CLRCALL_OR_CDECL _Getcat(const locale::facet **_Ppf = 0,
const locale *_Ploc = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT num_get<_Elem, _InIt>(
_Locinfo(_Ploc->c_str()));
return (_X_NUMERIC);
}
__PURE_APPDOMAIN_GLOBAL static locale::id id; // unique facet id
protected:
virtual __CLR_OR_THIS_CALL ~num_get()
{ // destroy the object
}
void _Init(const _Locinfo& _Lobj)
{ // initialize from _Locinfo object
_Cvt = _Lobj._Getcvt();
}
_Locinfo::_Cvtvec _Cvt; // conversion information
public:
explicit __CLR_OR_THIS_CALL num_get(size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from current locale
_BEGIN_LOCINFO(_Lobj)
_Init(_Lobj);
_END_LOCINFO()
}
__CLR_OR_THIS_CALL num_get(const _Locinfo& _Lobj, size_t _Refs = 0)
: locale::facet(_Refs)
{ // construct from specified locale
_Init(_Lobj);
}
typedef _Elem char_type;
typedef _InIt iter_type;
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_Bool& _Val) const
{ // get bool from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned short& _Val) const
{ // get unsigned short from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned int& _Val) const
{ // get unsigned int from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
long& _Val) const
{ // get long from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned long& _Val) const
{ // get unsigned long from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
#ifdef _LONGLONG
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_LONGLONG& _Val) const
{ // get long long from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_ULONGLONG& _Val) const
{ // get unsigned long long from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
#endif /* _LONGLONG */
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
float& _Val) const
{ // get float from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
double& _Val) const
{ // get double from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
long double& _Val) const
{ // get long double from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
_InIt __CLR_OR_THIS_CALL get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
void *& _Val) const
{ // get void pointer from [_First, _Last) into _Val
return (do_get(_First, _Last, _Iosbase, _State, _Val));
}
protected:
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
_Bool& _Val) const
{ // get bool from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
int _Ans = -1; // negative answer indicates failure
if (_Iosbase.flags() & ios_base::boolalpha)
{ // get false name or true name
typedef typename _Mystr::size_type _Mystrsize;
const _Mypunct& _Punct_fac = _USE(_Iosbase.getloc(), _Mypunct);
_Mystr _Str((_Mystrsize)1, (char_type)0);
_Str += _Punct_fac.falsename();
_Str += (char_type)0;
_Str += _Punct_fac.truename(); // construct "\0false\0true"
_Ans = _Getloctxt(_First, _Last, (size_t)2, _Str.c_str());
}
else
{ // get zero or nonzero integer
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
const unsigned long _Ulo = _CSTD _Stoulx(_Ac, &_Ep,
_Getifld(_Ac, _First, _Last, _Iosbase.flags(),
_Iosbase.getloc()), &_Errno);
if (_Ep != _Ac && _Errno == 0 && _Ulo <= 1)
_Ans = _Ulo;
}
if (_First == _Last)
_State |= ios_base::eofbit;
if (_Ans < 0)
_State |= ios_base::failbit;
else
_Val = _Ans != 0; // deliver value
return (_First);
}
virtual _InIt __CLR_OR_THIS_CALL do_get(_InIt _First, _InIt _Last,
ios_base& _Iosbase, ios_base::iostate& _State,
unsigned short& _Val) const
{ // get unsigned short from [_First, _Last) into _Val
_DEBUG_RANGE(_First, _Last);
char _Ac[_MAX_INT_DIG], *_Ep;
int _Errno = 0;
int _Base = _Getifld(_Ac, _First, _Last, _Iosbase.flags(),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -