diff --git a/_unit_tests_2compat_8hpp_source.html b/_unit_tests_2compat_8hpp_source.html index 7bccf596c..d2e014cea 100644 --- a/_unit_tests_2compat_8hpp_source.html +++ b/_unit_tests_2compat_8hpp_source.html @@ -172,7 +172,7 @@ $(function() { codefold.init(0); }); diff --git a/annotated.html b/annotated.html index b567784f4..0c4dc27ab 100644 --- a/annotated.html +++ b/annotated.html @@ -244,48 +244,51 @@ $(function() {  CnoteNote  CsilenceSilence  CwaveWaveform block - Cbase64_decBase64 decoding session - Cbase64_encBase64 encoding session - Cbase64_readerConverts from Base64 when reading from a stream - Cbase64_writerConverts to Base64 when writing to a stream - Cbasic_hashBasic hashing operations - Cblock_hashHashing in blocks - Ccharset_encoderEncoding converter context - Ccrc32_hashHashes as CRC32 - Cfree_locale_deleteDeleter for unique_ptr using free_locale - Cglobal_progressGlobal progress indicator base class - Chex_decHexadecimal decoding session - Chex_encHexadecimal encoding session - CintervalNumerical interval - Clazy_progressLazy progress indicator base class - ClocaleLocale_t helper class to free_locale when going out of scope - CmappingMaps index in source string to index in destination string - Cmd2_tMD2 hash value - Cmd5_hashHashes as MD5 - Cno_deleteNoop deleter - Cno_delete< T[]>Noop array deleter - CpoolPer-NUMA pool of items - CprogressProgress indicator base class - Cprogress_switcherProgress indicator switcher - CringRing buffer - Csha1_hashHashes as SHA1 - Csha256_tSHA256 hash value - Csha_tSHA hash value - CspinlockSpin-lock - Cstream_hasherHashes read to or write from data of the stream - Csys_info_tSystem information - Csys_objectOperating system object (file, pipe, anything with an OS handle etc.) - Cuser_cancelledUser cancelled exception - Cvector_queueHelper class to allow limited size FIFO queues implemented as vector of elements - CwatchdogTriggers callback if not reset frequently enough - Czlib_readerDecompresses data when reading from a stream - Czlib_writerCompresses data when writing to a stream + Caggregate_progressAggregated progress indicator + Cworker_progressProgress indicator for individual worker + Cbase64_decBase64 decoding session + Cbase64_encBase64 encoding session + Cbase64_readerConverts from Base64 when reading from a stream + Cbase64_writerConverts to Base64 when writing to a stream + Cbasic_hashBasic hashing operations + CbenchmarkMeasures time between initialization and going out of scope + Cblock_hashHashing in blocks + Ccharset_encoderEncoding converter context + Ccrc32_hashHashes as CRC32 + Cfree_locale_deleteDeleter for unique_ptr using free_locale + Cglobal_progressGlobal progress indicator + Chex_decHexadecimal decoding session + Chex_encHexadecimal encoding session + CintervalNumerical interval + Clazy_progressLazy progress indicator + ClocaleLocale_t helper class to free_locale when going out of scope + CmappingMaps index in source string to index in destination string + Cmd2_tMD2 hash value + Cmd5_hashHashes as MD5 + Cno_deleteNoop deleter + Cno_delete< T[]>Noop array deleter + CpoolPer-NUMA pool of items + CprogressProgress indicator base class + Cprogress_switcherProgress indicator switcher + CringRing buffer + Csha1_hashHashes as SHA1 + Csha256_tSHA256 hash value + Csha_tSHA hash value + CspinlockSpin-lock + Cstream_hasherHashes read to or write from data of the stream + Csys_info_tSystem information + Csys_objectOperating system object (file, pipe, anything with an OS handle etc.) + Cuser_cancelledUser cancelled exception + Cvector_queueHelper class to allow limited size FIFO queues implemented as vector of elements + CwatchdogTriggers callback if not reset frequently enough + Czlib_readerDecompresses data when reading from a stream + Czlib_writerCompresses data when writing to a stream diff --git a/base64_8hpp_source.html b/base64_8hpp_source.html index 7cacc464d..01bd070b5 100644 --- a/base64_8hpp_source.html +++ b/base64_8hpp_source.html @@ -543,7 +543,7 @@ $(function() { codefold.init(0); }); diff --git a/chrono_8hpp_source.html b/chrono_8hpp_source.html index ddef007e9..1f7328ee7 100644 --- a/chrono_8hpp_source.html +++ b/chrono_8hpp_source.html @@ -469,7 +469,7 @@ $(function() { codefold.init(0); }); diff --git a/classes.html b/classes.html index 2d981c468..cb6dfc423 100644 --- a/classes.html +++ b/classes.html @@ -79,10 +79,10 @@ $(function() {
A
-
aosn_date (stdex::chrono)
aosn_timestamp (stdex::chrono)
async_reader (stdex::stream)
async_writer (stdex::stream)
+
aggregate_progress (stdex)
aosn_date (stdex::chrono)
aosn_timestamp (stdex::chrono)
async_reader (stdex::stream)
async_writer (stdex::stream)
B
-
base64_dec (stdex)
base64_enc (stdex)
base64_reader (stdex)
base64_writer (stdex)
basic (stdex::stream)
basic_angle (stdex::parser)
basic_any_cu (stdex::parser)
basic_bol (stdex::parser)
basic_branch (stdex::parser)
basic_chemical_formula (stdex::parser)
basic_creditor_reference (stdex::parser)
basic_css_cdc (stdex::parser)
basic_css_cdo (stdex::parser)
basic_css_comment (stdex::parser)
basic_css_import (stdex::parser)
basic_css_string (stdex::parser)
basic_css_uri (stdex::parser)
basic_cu (stdex::parser)
basic_cu_set (stdex::parser)
basic_date (stdex::parser)
basic_dns_domain_char (stdex::parser)
basic_dns_name (stdex::parser)
basic_email_address (stdex::parser)
basic_emoticon (stdex::parser)
basic_eol (stdex::parser)
basic_file (stdex::stream)
basic_fraction (stdex::parser)
basic_hash (stdex)
basic_html_declaration_condition_end (stdex::parser)
basic_html_declaration_condition_start (stdex::parser)
basic_html_ident (stdex::parser)
basic_html_tag (stdex::parser)
basic_html_value (stdex::parser)
basic_iban (stdex::parser)
basic_integer (stdex::parser)
basic_integer10 (stdex::parser)
basic_integer10ts (stdex::parser)
basic_integer16 (stdex::parser)
basic_ipv4_address (stdex::parser)
basic_ipv6_address (stdex::parser)
basic_ipv6_scope_id_char (stdex::parser)
basic_iterations (stdex::parser)
basic_json_string (stdex::parser)
basic_mime_type (stdex::parser)
basic_mixed_numeral (stdex::parser)
basic_monetary_numeral (stdex::parser)
basic_noop (stdex::parser)
basic_parser (stdex::parser)
basic_permutation (stdex::parser)
basic_phone_number (stdex::parser)
basic_punct_cu (stdex::parser)
basic_roman_numeral (stdex::parser)
basic_scientific_numeral (stdex::parser)
basic_score (stdex::parser)
basic_sequence (stdex::parser)
basic_set (stdex::parser)
basic_si_reference (stdex::parser)
basic_si_reference_delimiter (stdex::parser)
basic_si_reference_part (stdex::parser)
basic_signed_numeral (stdex::parser)
basic_space_cu (stdex::parser)
basic_space_or_punct_cu (stdex::parser)
basic_string (stdex::parser)
basic_string_branch (stdex::parser)
basic_sys (stdex::stream)
basic_time (stdex::parser)
basic_url (stdex::parser)
basic_url_password_char (stdex::parser)
basic_url_path (stdex::parser)
basic_url_path_char (stdex::parser)
basic_url_username_char (stdex::parser)
block_hash (stdex)
buffer (stdex::stream)
buffer::buffer_t (stdex::stream)
buffered_sys (stdex::stream)
+
base64_dec (stdex)
base64_enc (stdex)
base64_reader (stdex)
base64_writer (stdex)
basic (stdex::stream)
basic_angle (stdex::parser)
basic_any_cu (stdex::parser)
basic_bol (stdex::parser)
basic_branch (stdex::parser)
basic_chemical_formula (stdex::parser)
basic_creditor_reference (stdex::parser)
basic_css_cdc (stdex::parser)
basic_css_cdo (stdex::parser)
basic_css_comment (stdex::parser)
basic_css_import (stdex::parser)
basic_css_string (stdex::parser)
basic_css_uri (stdex::parser)
basic_cu (stdex::parser)
basic_cu_set (stdex::parser)
basic_date (stdex::parser)
basic_dns_domain_char (stdex::parser)
basic_dns_name (stdex::parser)
basic_email_address (stdex::parser)
basic_emoticon (stdex::parser)
basic_eol (stdex::parser)
basic_file (stdex::stream)
basic_fraction (stdex::parser)
basic_hash (stdex)
basic_html_declaration_condition_end (stdex::parser)
basic_html_declaration_condition_start (stdex::parser)
basic_html_ident (stdex::parser)
basic_html_tag (stdex::parser)
basic_html_value (stdex::parser)
basic_iban (stdex::parser)
basic_integer (stdex::parser)
basic_integer10 (stdex::parser)
basic_integer10ts (stdex::parser)
basic_integer16 (stdex::parser)
basic_ipv4_address (stdex::parser)
basic_ipv6_address (stdex::parser)
basic_ipv6_scope_id_char (stdex::parser)
basic_iterations (stdex::parser)
basic_json_string (stdex::parser)
basic_mime_type (stdex::parser)
basic_mixed_numeral (stdex::parser)
basic_monetary_numeral (stdex::parser)
basic_noop (stdex::parser)
basic_parser (stdex::parser)
basic_permutation (stdex::parser)
basic_phone_number (stdex::parser)
basic_punct_cu (stdex::parser)
basic_roman_numeral (stdex::parser)
basic_scientific_numeral (stdex::parser)
basic_score (stdex::parser)
basic_sequence (stdex::parser)
basic_set (stdex::parser)
basic_si_reference (stdex::parser)
basic_si_reference_delimiter (stdex::parser)
basic_si_reference_part (stdex::parser)
basic_signed_numeral (stdex::parser)
basic_space_cu (stdex::parser)
basic_space_or_punct_cu (stdex::parser)
basic_string (stdex::parser)
basic_string_branch (stdex::parser)
basic_sys (stdex::stream)
basic_time (stdex::parser)
basic_url (stdex::parser)
basic_url_password_char (stdex::parser)
basic_url_path (stdex::parser)
basic_url_path_char (stdex::parser)
basic_url_username_char (stdex::parser)
benchmark (stdex)
block_hash (stdex)
buffer (stdex::stream)
buffer::buffer_t (stdex::stream)
buffered_sys (stdex::stream)
C
cache (stdex::stream)
cached_file (stdex::stream)
charset_encoder (stdex)
comment (stdex::html)
converter (stdex::stream)
crc32_hash (stdex)
cue (stdex::wav)
cue_ex (stdex::wav)
@@ -133,7 +133,7 @@ $(function() {
vector_queue (stdex)
W
-
watchdog (stdex)
wave (stdex::wav)
window (stdex::stream)
replicator::worker (stdex::stream)
+
watchdog (stdex)
wave (stdex::wav)
window (stdex::stream)
replicator::worker (stdex::stream)
aggregate_progress::worker_progress (stdex)
Z
zlib_reader (stdex)
zlib_writer (stdex)
@@ -141,7 +141,7 @@ $(function() {
diff --git a/classstdex_1_1aggregate__progress-members.html b/classstdex_1_1aggregate__progress-members.html new file mode 100644 index 000000000..503e70c8f --- /dev/null +++ b/classstdex_1_1aggregate__progress-members.html @@ -0,0 +1,101 @@ + + + + + + + +stdex: Member List + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
stdex::aggregate_progress< T > Member List
+
+
+ +

This is the complete list of members for stdex::aggregate_progress< T >, including all inherited members.

+ + + + + + + + + + + +
aggregate_progress(size_t num_workers, progress< T > *host=nullptr)stdex::aggregate_progress< T >inline
attach(progress< T > *host)stdex::aggregate_progress< T >inline
detach()stdex::aggregate_progress< T >inline
m_end (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
m_host (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
m_mutex (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
m_start (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
m_value (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
m_workers (defined in stdex::aggregate_progress< T >)stdex::aggregate_progress< T >protected
operator[](size_t index)stdex::aggregate_progress< T >inline
+ + + + diff --git a/classstdex_1_1aggregate__progress.html b/classstdex_1_1aggregate__progress.html new file mode 100644 index 000000000..861410f1b --- /dev/null +++ b/classstdex_1_1aggregate__progress.html @@ -0,0 +1,291 @@ + + + + + + + +stdex: stdex::aggregate_progress< T > Class Template Reference + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Classes | +Public Member Functions | +Protected Attributes | +List of all members
+
stdex::aggregate_progress< T > Class Template Reference
+
+
+ +

Aggregated progress indicator. + More...

+ +

#include <stdex/progress.hpp>

+ + + + + +

+Classes

class  worker_progress
 Progress indicator for individual worker. More...
 
+ + + + + + + + + + + + + +

+Public Member Functions

 aggregate_progress (size_t num_workers, progress< T > *host=nullptr)
 Constructs a progress indicator.
 
void attach (progress< T > *host)
 Attach to a host progress indicator.
 
progress< T > * detach ()
 Detach host progress indicator.
 
progress< T > & operator[] (size_t index)
 Returns progress indicator for specific worker.
 
+ + + + + + + + + + + + + +

+Protected Attributes

+progress< T > * m_host
 
+std::atomic< T > m_start
 
+std::atomic< T > m_end
 
+std::atomic< T > m_value
 
+std::vector< worker_progressm_workers
 
+std::shared_mutex m_mutex
 
+

Detailed Description

+
template<class T>
+class stdex::aggregate_progress< T >

Aggregated progress indicator.

+

Use to report combined progress from multiple workers.

+

Constructor & Destructor Documentation

+ +

◆ aggregate_progress()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + +
stdex::aggregate_progress< T >::aggregate_progress (size_t num_workers,
progress< T > * host = nullptr )
+
+inline
+
+ +

Constructs a progress indicator.

+
Parameters
+ + + +
[in]num_workersTotal number of workers
[in]hostHost progress indicator
+
+
+ +
+
+

Member Function Documentation

+ +

◆ attach()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
void stdex::aggregate_progress< T >::attach (progress< T > * host)
+
+inline
+
+ +

Attach to a host progress indicator.

+
Parameters
+ + +
[in]hostHost progress indicator
+
+
+ +
+
+ +

◆ detach()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
progress< T > * stdex::aggregate_progress< T >::detach ()
+
+inline
+
+ +

Detach host progress indicator.

+
Returns
Old host progress indicator
+ +
+
+ +

◆ operator[]()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
progress< T > & stdex::aggregate_progress< T >::operator[] (size_t index)
+
+inline
+
+ +

Returns progress indicator for specific worker.

+
Parameters
+ + +
[in]indexIndex of worker
+
+
+
Returns
Reference to specific worker progress indicator
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/classstdex_1_1aggregate__progress_1_1worker__progress-members.html b/classstdex_1_1aggregate__progress_1_1worker__progress-members.html new file mode 100644 index 000000000..0988b3bed --- /dev/null +++ b/classstdex_1_1aggregate__progress_1_1worker__progress-members.html @@ -0,0 +1,101 @@ + + + + + + + +stdex: Member List + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
stdex::aggregate_progress< T >::worker_progress Member List
+
+
+ +

This is the complete list of members for stdex::aggregate_progress< T >::worker_progress, including all inherited members.

+ + + + + + + + + + + +
cancel()stdex::aggregate_progress< T >::worker_progressinlinevirtual
m_end (defined in stdex::aggregate_progress< T >::worker_progress)stdex::aggregate_progress< T >::worker_progressprotected
m_host (defined in stdex::aggregate_progress< T >::worker_progress)stdex::aggregate_progress< T >::worker_progressprotected
m_start (defined in stdex::aggregate_progress< T >::worker_progress)stdex::aggregate_progress< T >::worker_progressprotected
m_value (defined in stdex::aggregate_progress< T >::worker_progress)stdex::aggregate_progress< T >::worker_progressprotected
set(T value)stdex::aggregate_progress< T >::worker_progressinlinevirtual
set_range(T start, T end)stdex::aggregate_progress< T >::worker_progressinlinevirtual
set_text(const char *msg)stdex::aggregate_progress< T >::worker_progressinlinevirtual
show(bool show=true)stdex::aggregate_progress< T >::worker_progressinlinevirtual
worker_progress(aggregate_progress< T > &host) (defined in stdex::aggregate_progress< T >::worker_progress)stdex::aggregate_progress< T >::worker_progressinline
+ + + + diff --git a/classstdex_1_1aggregate__progress_1_1worker__progress.html b/classstdex_1_1aggregate__progress_1_1worker__progress.html new file mode 100644 index 000000000..a0da5899c --- /dev/null +++ b/classstdex_1_1aggregate__progress_1_1worker__progress.html @@ -0,0 +1,334 @@ + + + + + + + +stdex: stdex::aggregate_progress< T >::worker_progress Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Attributes | +List of all members
+
stdex::aggregate_progress< T >::worker_progress Class Reference
+
+
+ +

Progress indicator for individual worker. + More...

+ +

#include <stdex/progress.hpp>

+
+Inheritance diagram for stdex::aggregate_progress< T >::worker_progress:
+
+
+ + +stdex::progress< T > + +
+ + + + + + + + + + + + + + + + + + + +

+Public Member Functions

worker_progress (aggregate_progress< T > &host)
 
virtual void set_text (const char *msg)
 Set progress indicator text.
 
virtual void set_range (T start, T end)
 Set local extend of the progress indicator.
 
virtual void set (T value)
 Set local current progress.
 
virtual void show (bool show=true)
 Show or hide progress.
 
virtual bool cancel ()
 Query whether user requested abort.
 
+ + + + + + + + + +

+Protected Attributes

+aggregate_progress< T > & m_host
 
+T m_start
 
+T m_end
 
+T m_value
 
+

Detailed Description

+
template<class T>
+class stdex::aggregate_progress< T >::worker_progress

Progress indicator for individual worker.

+

Member Function Documentation

+ +

◆ cancel()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
virtual bool stdex::aggregate_progress< T >::worker_progress::cancel ()
+
+inlinevirtual
+
+ +

Query whether user requested abort.

+ +

Reimplemented from stdex::progress< T >.

+ +
+
+ +

◆ set()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
virtual void stdex::aggregate_progress< T >::worker_progress::set (T value)
+
+inlinevirtual
+
+ +

Set local current progress.

+
Parameters
+ + +
[in]valueCurrent value of the progress. Must be between start and end parameters provided in set_range() call.
+
+
+ +

Reimplemented from stdex::progress< T >.

+ +
+
+ +

◆ set_range()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + + + + + +
virtual void stdex::aggregate_progress< T >::worker_progress::set_range (T start,
T end )
+
+inlinevirtual
+
+ +

Set local extend of the progress indicator.

+
Parameters
+ + + +
[in]startMinimum value of the progress
[in]endMaximum value of the progress
+
+
+ +

Reimplemented from stdex::progress< T >.

+ +
+
+ +

◆ set_text()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
virtual void stdex::aggregate_progress< T >::worker_progress::set_text (const char * msg)
+
+inlinevirtual
+
+ +

Set progress indicator text.

+
Parameters
+ + +
[in]msgText to display
+
+
+ +

Reimplemented from stdex::progress< T >.

+ +
+
+ +

◆ show()

+ +
+
+
+template<class T >
+ + + + + +
+ + + + + + + +
virtual void stdex::aggregate_progress< T >::worker_progress::show (bool show = true)
+
+inlinevirtual
+
+ +

Show or hide progress.

+
Parameters
+ + +
[in]showShows or hides progress indicator
+
+
+ +

Reimplemented from stdex::progress< T >.

+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/classstdex_1_1aggregate__progress_1_1worker__progress.png b/classstdex_1_1aggregate__progress_1_1worker__progress.png new file mode 100644 index 000000000..d967c2fc6 Binary files /dev/null and b/classstdex_1_1aggregate__progress_1_1worker__progress.png differ diff --git a/classstdex_1_1base64__dec-members.html b/classstdex_1_1base64__dec-members.html index 5b46ab9b1..e02fd2fa9 100644 --- a/classstdex_1_1base64__dec-members.html +++ b/classstdex_1_1base64__dec-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1base64__dec.html b/classstdex_1_1base64__dec.html index fa9ce5825..1241993f6 100644 --- a/classstdex_1_1base64__dec.html +++ b/classstdex_1_1base64__dec.html @@ -231,7 +231,7 @@ template<class T_to , class AX , class T_from > diff --git a/classstdex_1_1base64__enc-members.html b/classstdex_1_1base64__enc-members.html index a18be152f..4e30650f7 100644 --- a/classstdex_1_1base64__enc-members.html +++ b/classstdex_1_1base64__enc-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1base64__enc.html b/classstdex_1_1base64__enc.html index 217bc40ee..39ee3fb4c 100644 --- a/classstdex_1_1base64__enc.html +++ b/classstdex_1_1base64__enc.html @@ -236,7 +236,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1base64__reader-members.html b/classstdex_1_1base64__reader-members.html index 36b5d3073..5a82041a1 100644 --- a/classstdex_1_1base64__reader-members.html +++ b/classstdex_1_1base64__reader-members.html @@ -163,7 +163,7 @@ $(function() { diff --git a/classstdex_1_1base64__reader.html b/classstdex_1_1base64__reader.html index e87cab1f9..89c75512c 100644 --- a/classstdex_1_1base64__reader.html +++ b/classstdex_1_1base64__reader.html @@ -434,7 +434,7 @@ size_t m_num diff --git a/classstdex_1_1base64__writer-members.html b/classstdex_1_1base64__writer-members.html index 0f060342c..5b4c5adf2 100644 --- a/classstdex_1_1base64__writer-members.html +++ b/classstdex_1_1base64__writer-members.html @@ -165,7 +165,7 @@ $(function() { diff --git a/classstdex_1_1base64__writer.html b/classstdex_1_1base64__writer.html index 3c5c99019..54ec0f19b 100644 --- a/classstdex_1_1base64__writer.html +++ b/classstdex_1_1base64__writer.html @@ -441,7 +441,7 @@ size_t m_num diff --git a/classstdex_1_1basic__hash-members.html b/classstdex_1_1basic__hash-members.html index 849d85cb0..a116a3fba 100644 --- a/classstdex_1_1basic__hash-members.html +++ b/classstdex_1_1basic__hash-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1basic__hash.html b/classstdex_1_1basic__hash.html index dbca42ffc..bfcd3d583 100644 --- a/classstdex_1_1basic__hash.html +++ b/classstdex_1_1basic__hash.html @@ -250,7 +250,7 @@ template<class T > diff --git a/classstdex_1_1benchmark-members.html b/classstdex_1_1benchmark-members.html new file mode 100644 index 000000000..6b0e795c5 --- /dev/null +++ b/classstdex_1_1benchmark-members.html @@ -0,0 +1,95 @@ + + + + + + + +stdex: Member List + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
stdex::benchmark Member List
+
+
+ +

This is the complete list of members for stdex::benchmark, including all inherited members.

+ + + + + +
benchmark(const char *task_name)stdex::benchmarkinline
m_start (defined in stdex::benchmark)stdex::benchmarkprotected
m_task_name (defined in stdex::benchmark)stdex::benchmarkprotected
~benchmark()stdex::benchmarkinline
+ + + + diff --git a/classstdex_1_1benchmark.html b/classstdex_1_1benchmark.html new file mode 100644 index 000000000..ffc86c6fe --- /dev/null +++ b/classstdex_1_1benchmark.html @@ -0,0 +1,156 @@ + + + + + + + +stdex: stdex::benchmark Class Reference + + + + + + + + + + + +
+
+ + + + + + +
+
stdex +
+
Additional custom or not Standard C++ covered algorithms
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+Public Member Functions | +Protected Attributes | +List of all members
+
stdex::benchmark Class Reference
+
+
+ +

Measures time between initialization and going out of scope. + More...

+ +

#include <stdex/debug.hpp>

+ + + + + + + + +

+Public Member Functions

 benchmark (const char *task_name)
 Starts the measurement.
 
~benchmark ()
 Stops the measurement and outputs the result to the diagnostic console.
 
+ + + + + +

+Protected Attributes

+const char * m_task_name
 
+std::chrono::time_point< std::chrono::high_resolution_clock > m_start
 
+

Detailed Description

+

Measures time between initialization and going out of scope.

+

Constructor & Destructor Documentation

+ +

◆ benchmark()

+ +
+
+ + + + + +
+ + + + + + + +
stdex::benchmark::benchmark (const char * task_name)
+
+inline
+
+ +

Starts the measurement.

+
Parameters
+ + +
[in]task_nameName of the task. The string must remain resident for the lifetime of this object
+
+
+ +
+
+
The documentation for this class was generated from the following file: +
+ + + + diff --git a/classstdex_1_1block__hash-members.html b/classstdex_1_1block__hash-members.html index d24b56d4b..3807aa26d 100644 --- a/classstdex_1_1block__hash-members.html +++ b/classstdex_1_1block__hash-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1block__hash.html b/classstdex_1_1block__hash.html index 0e78600f2..0db192fbf 100644 --- a/classstdex_1_1block__hash.html +++ b/classstdex_1_1block__hash.html @@ -240,7 +240,7 @@ template<class T > diff --git a/classstdex_1_1charset__encoder-members.html b/classstdex_1_1charset__encoder-members.html index b41e6542e..c5fc48090 100644 --- a/classstdex_1_1charset__encoder-members.html +++ b/classstdex_1_1charset__encoder-members.html @@ -104,7 +104,7 @@ $(function() { diff --git a/classstdex_1_1charset__encoder.html b/classstdex_1_1charset__encoder.html index e812fc9fb..15a85ca2a 100644 --- a/classstdex_1_1charset__encoder.html +++ b/classstdex_1_1charset__encoder.html @@ -556,7 +556,7 @@ template<class TR_to = std::char_traits<T_to>, class AX_to = std::all diff --git a/classstdex_1_1crc32__hash-members.html b/classstdex_1_1crc32__hash-members.html index e06a90b0c..0cce3701d 100644 --- a/classstdex_1_1crc32__hash-members.html +++ b/classstdex_1_1crc32__hash-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1crc32__hash.html b/classstdex_1_1crc32__hash.html index 7e57da5a9..b22d29a0e 100644 --- a/classstdex_1_1crc32__hash.html +++ b/classstdex_1_1crc32__hash.html @@ -240,7 +240,7 @@ crc32_t m_value diff --git a/classstdex_1_1global__progress-members.html b/classstdex_1_1global__progress-members.html index 384cedbdf..c6ddc379f 100644 --- a/classstdex_1_1global__progress-members.html +++ b/classstdex_1_1global__progress-members.html @@ -85,7 +85,7 @@ $(function() { attach(progress< T > *host)stdex::global_progress< T >inline cancel()stdex::global_progress< T >inlinevirtual detach()stdex::global_progress< T >inline - global_progress(progress< T > *host=NULL)stdex::global_progress< T >inline + global_progress(progress< T > *host=nullptr)stdex::global_progress< T >inline m_global (defined in stdex::global_progress< T >)stdex::global_progress< T >protected m_host (defined in stdex::global_progress< T >)stdex::global_progress< T >protected m_local (defined in stdex::global_progress< T >)stdex::global_progress< T >protected @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1global__progress.html b/classstdex_1_1global__progress.html index 2745933a6..1ccbd3ce4 100644 --- a/classstdex_1_1global__progress.html +++ b/classstdex_1_1global__progress.html @@ -84,7 +84,7 @@ $(function() {
-

Global progress indicator base class. +

Global progress indicator. More...

#include <stdex/progress.hpp>

@@ -101,9 +101,9 @@ Inheritance diagram for stdex::global_progress< T >:
- - - + + + @@ -149,11 +149,11 @@ Protected Attributes

Public Member Functions

 global_progress (progress< T > *host=NULL)
 Constructs a progress indicator.
 
 global_progress (progress< T > *host=nullptr)
 Constructs a progress indicator.
 
void attach (progress< T > *host)
 Attach to a host progress indicator.
 

Detailed Description

template<class T>
-class stdex::global_progress< T >

Global progress indicator base class.

+class stdex::global_progress< T >

Global progress indicator.

Use to report progress of a phase or section as a part of a whole progress.

Constructor & Destructor Documentation

- -

◆ global_progress()

+ +

◆ global_progress()

@@ -166,7 +166,7 @@ template<class T >
stdex::global_progress< T >::global_progress ( - progress< T > * host = NULL) + progress< T > * host = nullptr) @@ -523,7 +523,7 @@ template<class T >
diff --git a/classstdex_1_1hex__dec-members.html b/classstdex_1_1hex__dec-members.html index aad6616ba..69085d2c2 100644 --- a/classstdex_1_1hex__dec-members.html +++ b/classstdex_1_1hex__dec-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1hex__dec.html b/classstdex_1_1hex__dec.html index 1d577d2a2..778af2e69 100644 --- a/classstdex_1_1hex__dec.html +++ b/classstdex_1_1hex__dec.html @@ -213,7 +213,7 @@ template<class T_to , class AX , class T_from > diff --git a/classstdex_1_1hex__enc-members.html b/classstdex_1_1hex__enc-members.html index a83ca7349..ab6579c1b 100644 --- a/classstdex_1_1hex__enc-members.html +++ b/classstdex_1_1hex__enc-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1hex__enc.html b/classstdex_1_1hex__enc.html index a063dc835..5a6777ef2 100644 --- a/classstdex_1_1hex__enc.html +++ b/classstdex_1_1hex__enc.html @@ -191,7 +191,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1html_1_1comment-members.html b/classstdex_1_1html_1_1comment-members.html index 263488845..9e47a2491 100644 --- a/classstdex_1_1html_1_1comment-members.html +++ b/classstdex_1_1html_1_1comment-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1comment.html b/classstdex_1_1html_1_1comment.html index f363758ab..801920c41 100644 --- a/classstdex_1_1html_1_1comment.html +++ b/classstdex_1_1html_1_1comment.html @@ -137,7 +137,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1declaration-members.html b/classstdex_1_1html_1_1declaration-members.html index 7e7c0400d..af234d1ef 100644 --- a/classstdex_1_1html_1_1declaration-members.html +++ b/classstdex_1_1html_1_1declaration-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1declaration.html b/classstdex_1_1html_1_1declaration.html index 0a96fe568..1a7d6e731 100644 --- a/classstdex_1_1html_1_1declaration.html +++ b/classstdex_1_1html_1_1declaration.html @@ -141,7 +141,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1document-members.html b/classstdex_1_1html_1_1document-members.html index 94a8900ff..82c80f635 100644 --- a/classstdex_1_1html_1_1document-members.html +++ b/classstdex_1_1html_1_1document-members.html @@ -109,7 +109,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1document.html b/classstdex_1_1html_1_1document.html index c0c0e92c8..cf17e671b 100644 --- a/classstdex_1_1html_1_1document.html +++ b/classstdex_1_1html_1_1document.html @@ -199,7 +199,7 @@ class stdex::html::document< T, TR, AX >

HTML document.

diff --git a/classstdex_1_1html_1_1element-members.html b/classstdex_1_1html_1_1element-members.html index 64c4ec0ae..5c7beca42 100644 --- a/classstdex_1_1html_1_1element-members.html +++ b/classstdex_1_1html_1_1element-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element.html b/classstdex_1_1html_1_1element.html index 2939081ba..4dc8d71fd 100644 --- a/classstdex_1_1html_1_1element.html +++ b/classstdex_1_1html_1_1element.html @@ -154,7 +154,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1element__end-members.html b/classstdex_1_1html_1_1element__end-members.html index a15cbce74..31f174d71 100644 --- a/classstdex_1_1html_1_1element__end-members.html +++ b/classstdex_1_1html_1_1element__end-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element__end.html b/classstdex_1_1html_1_1element__end.html index 8c16d6419..1c2587cdb 100644 --- a/classstdex_1_1html_1_1element__end.html +++ b/classstdex_1_1html_1_1element__end.html @@ -145,7 +145,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1element__start-members.html b/classstdex_1_1html_1_1element__start-members.html index 35ae3dad3..1aa42083b 100644 --- a/classstdex_1_1html_1_1element__start-members.html +++ b/classstdex_1_1html_1_1element__start-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1element__start.html b/classstdex_1_1html_1_1element__start.html index eeb82ff21..a4957fdb9 100644 --- a/classstdex_1_1html_1_1element__start.html +++ b/classstdex_1_1html_1_1element__start.html @@ -164,7 +164,7 @@ template<class T > diff --git a/classstdex_1_1html_1_1instruction-members.html b/classstdex_1_1html_1_1instruction-members.html index 3b5d72ad0..52628b480 100644 --- a/classstdex_1_1html_1_1instruction-members.html +++ b/classstdex_1_1html_1_1instruction-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1instruction.html b/classstdex_1_1html_1_1instruction.html index 3dbb3c875..2f0e855dd 100644 --- a/classstdex_1_1html_1_1instruction.html +++ b/classstdex_1_1html_1_1instruction.html @@ -137,7 +137,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1parser-members.html b/classstdex_1_1html_1_1parser-members.html index f8777171b..dcdfe7b60 100644 --- a/classstdex_1_1html_1_1parser-members.html +++ b/classstdex_1_1html_1_1parser-members.html @@ -112,7 +112,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1parser.html b/classstdex_1_1html_1_1parser.html index ff89a6366..9d1e251ef 100644 --- a/classstdex_1_1html_1_1parser.html +++ b/classstdex_1_1html_1_1parser.html @@ -564,7 +564,7 @@ template<class T , class TR , class AX > diff --git a/classstdex_1_1html_1_1sequence-members.html b/classstdex_1_1html_1_1sequence-members.html index e24dfd875..566946821 100644 --- a/classstdex_1_1html_1_1sequence-members.html +++ b/classstdex_1_1html_1_1sequence-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1sequence.html b/classstdex_1_1html_1_1sequence.html index 803abd928..64db527e4 100644 --- a/classstdex_1_1html_1_1sequence.html +++ b/classstdex_1_1html_1_1sequence.html @@ -132,7 +132,7 @@ stdex::parser::html_sequence_t  diff --git a/classstdex_1_1html_1_1starting__token-members.html b/classstdex_1_1html_1_1starting__token-members.html index 411077263..47f3d981b 100644 --- a/classstdex_1_1html_1_1starting__token-members.html +++ b/classstdex_1_1html_1_1starting__token-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1starting__token.html b/classstdex_1_1html_1_1starting__token.html index e053def73..408b0c8ab 100644 --- a/classstdex_1_1html_1_1starting__token.html +++ b/classstdex_1_1html_1_1starting__token.html @@ -183,7 +183,7 @@ class stdex::html::starting_token< T, TR, AX >

Token representing

diff --git a/classstdex_1_1html_1_1text__token-members.html b/classstdex_1_1html_1_1text__token-members.html index 306fac23d..ef57aa662 100644 --- a/classstdex_1_1html_1_1text__token-members.html +++ b/classstdex_1_1html_1_1text__token-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1text__token.html b/classstdex_1_1html_1_1text__token.html index c3828ac7d..5e843f963 100644 --- a/classstdex_1_1html_1_1text__token.html +++ b/classstdex_1_1html_1_1text__token.html @@ -170,7 +170,7 @@ class stdex::html::text_token< T, TR, AX >

Token representing part

diff --git a/classstdex_1_1html_1_1token-members.html b/classstdex_1_1html_1_1token-members.html index 09ac4d91b..96eae530b 100644 --- a/classstdex_1_1html_1_1token-members.html +++ b/classstdex_1_1html_1_1token-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1token.html b/classstdex_1_1html_1_1token.html index d6944361a..630a0d47e 100644 --- a/classstdex_1_1html_1_1token.html +++ b/classstdex_1_1html_1_1token.html @@ -231,7 +231,7 @@ template<class TR = std::char_traits<wchar_t>, class AX = std::alloca diff --git a/classstdex_1_1html_1_1url__token-members.html b/classstdex_1_1html_1_1url__token-members.html index be33284f6..9dadabcd7 100644 --- a/classstdex_1_1html_1_1url__token-members.html +++ b/classstdex_1_1html_1_1url__token-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1html_1_1url__token.html b/classstdex_1_1html_1_1url__token.html index 12324878a..a0286f739 100644 --- a/classstdex_1_1html_1_1url__token.html +++ b/classstdex_1_1html_1_1url__token.html @@ -165,7 +165,7 @@ class stdex::html::url_token< T, TR, AX >

HTTP token representing

diff --git a/classstdex_1_1idrec_1_1record-members.html b/classstdex_1_1idrec_1_1record-members.html index 2e04af5d1..24210ade2 100644 --- a/classstdex_1_1idrec_1_1record-members.html +++ b/classstdex_1_1idrec_1_1record-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1idrec_1_1record.html b/classstdex_1_1idrec_1_1record.html index 6be888f1d..0b08cae3d 100644 --- a/classstdex_1_1idrec_1_1record.html +++ b/classstdex_1_1idrec_1_1record.html @@ -764,7 +764,7 @@ template<class T , class T_id , const T_id ID, class T_size , T_size N_align& diff --git a/classstdex_1_1lazy__progress-members.html b/classstdex_1_1lazy__progress-members.html index b20589670..b9160393d 100644 --- a/classstdex_1_1lazy__progress-members.html +++ b/classstdex_1_1lazy__progress-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1lazy__progress.html b/classstdex_1_1lazy__progress.html index a4ffc35b3..629422b29 100644 --- a/classstdex_1_1lazy__progress.html +++ b/classstdex_1_1lazy__progress.html @@ -85,7 +85,7 @@ $(function() {
-

Lazy progress indicator base class. +

Lazy progress indicator. More...

#include <stdex/progress.hpp>

@@ -148,7 +148,7 @@ T m_value

Detailed Description

template<class T>
-class stdex::lazy_progress< T >

Lazy progress indicator base class.

+class stdex::lazy_progress< T >

Lazy progress indicator.

Use with expensive progress reporting to suppress progress indication for a period of time.

Constructor & Destructor Documentation

@@ -272,7 +272,7 @@ template<class T > diff --git a/classstdex_1_1locale-members.html b/classstdex_1_1locale-members.html index baad03a6e..29f82a53b 100644 --- a/classstdex_1_1locale-members.html +++ b/classstdex_1_1locale-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1locale.html b/classstdex_1_1locale.html index f4fda4c7f..e6816020a 100644 --- a/classstdex_1_1locale.html +++ b/classstdex_1_1locale.html @@ -117,7 +117,7 @@ Public Member Functions diff --git a/classstdex_1_1md5__hash-members.html b/classstdex_1_1md5__hash-members.html index cf61ea912..b5db1612b 100644 --- a/classstdex_1_1md5__hash-members.html +++ b/classstdex_1_1md5__hash-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1md5__hash.html b/classstdex_1_1md5__hash.html index d331630d3..275804ea6 100644 --- a/classstdex_1_1md5__hash.html +++ b/classstdex_1_1md5__hash.html @@ -261,7 +261,7 @@ uint32_t m_temp [16] diff --git a/classstdex_1_1parser_1_1basic__angle-members.html b/classstdex_1_1parser_1_1basic__angle-members.html index 06b368f91..31b023e71 100644 --- a/classstdex_1_1parser_1_1basic__angle-members.html +++ b/classstdex_1_1parser_1_1basic__angle-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__angle.html b/classstdex_1_1parser_1_1basic__angle.html index 9acb1af4c..9dad4a4bd 100644 --- a/classstdex_1_1parser_1_1basic__angle.html +++ b/classstdex_1_1parser_1_1basic__angle.html @@ -243,7 +243,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__any__cu-members.html b/classstdex_1_1parser_1_1basic__any__cu-members.html index a8639a172..67cd72d19 100644 --- a/classstdex_1_1parser_1_1basic__any__cu-members.html +++ b/classstdex_1_1parser_1_1basic__any__cu-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__any__cu.html b/classstdex_1_1parser_1_1basic__any__cu.html index f5511d522..fc67e7db5 100644 --- a/classstdex_1_1parser_1_1basic__any__cu.html +++ b/classstdex_1_1parser_1_1basic__any__cu.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__bol-members.html b/classstdex_1_1parser_1_1basic__bol-members.html index 0beea09b9..7a0498e9d 100644 --- a/classstdex_1_1parser_1_1basic__bol-members.html +++ b/classstdex_1_1parser_1_1basic__bol-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__bol.html b/classstdex_1_1parser_1_1basic__bol.html index b11439b72..20632a065 100644 --- a/classstdex_1_1parser_1_1basic__bol.html +++ b/classstdex_1_1parser_1_1basic__bol.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__branch-members.html b/classstdex_1_1parser_1_1basic__branch-members.html index cf5c0aeee..a6169d5ef 100644 --- a/classstdex_1_1parser_1_1basic__branch-members.html +++ b/classstdex_1_1parser_1_1basic__branch-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__branch.html b/classstdex_1_1parser_1_1basic__branch.html index ac5e07f75..c0123be1f 100644 --- a/classstdex_1_1parser_1_1basic__branch.html +++ b/classstdex_1_1parser_1_1basic__branch.html @@ -248,7 +248,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__chemical__formula-members.html b/classstdex_1_1parser_1_1basic__chemical__formula-members.html index 87d9ba5d2..127f01d78 100644 --- a/classstdex_1_1parser_1_1basic__chemical__formula-members.html +++ b/classstdex_1_1parser_1_1basic__chemical__formula-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__chemical__formula.html b/classstdex_1_1parser_1_1basic__chemical__formula.html index e0e041c21..b552cc710 100644 --- a/classstdex_1_1parser_1_1basic__chemical__formula.html +++ b/classstdex_1_1parser_1_1basic__chemical__formula.html @@ -238,7 +238,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__creditor__reference-members.html b/classstdex_1_1parser_1_1basic__creditor__reference-members.html index d6fdcc260..a1a22de4d 100644 --- a/classstdex_1_1parser_1_1basic__creditor__reference-members.html +++ b/classstdex_1_1parser_1_1basic__creditor__reference-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__creditor__reference.html b/classstdex_1_1parser_1_1basic__creditor__reference.html index f97f366db..e4a46a443 100644 --- a/classstdex_1_1parser_1_1basic__creditor__reference.html +++ b/classstdex_1_1parser_1_1basic__creditor__reference.html @@ -239,7 +239,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__cdc-members.html b/classstdex_1_1parser_1_1basic__css__cdc-members.html index 851d9687b..cdc6dd453 100644 --- a/classstdex_1_1parser_1_1basic__css__cdc-members.html +++ b/classstdex_1_1parser_1_1basic__css__cdc-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__cdc.html b/classstdex_1_1parser_1_1basic__css__cdc.html index 4dfebb915..5f5f7e1a2 100644 --- a/classstdex_1_1parser_1_1basic__css__cdc.html +++ b/classstdex_1_1parser_1_1basic__css__cdc.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__cdo-members.html b/classstdex_1_1parser_1_1basic__css__cdo-members.html index dbf406f1a..4d54f4d89 100644 --- a/classstdex_1_1parser_1_1basic__css__cdo-members.html +++ b/classstdex_1_1parser_1_1basic__css__cdo-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__cdo.html b/classstdex_1_1parser_1_1basic__css__cdo.html index 706eb0b24..b8dc74209 100644 --- a/classstdex_1_1parser_1_1basic__css__cdo.html +++ b/classstdex_1_1parser_1_1basic__css__cdo.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__comment-members.html b/classstdex_1_1parser_1_1basic__css__comment-members.html index 72fe72cd9..42bf28993 100644 --- a/classstdex_1_1parser_1_1basic__css__comment-members.html +++ b/classstdex_1_1parser_1_1basic__css__comment-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__comment.html b/classstdex_1_1parser_1_1basic__css__comment.html index 2e870b890..89b991817 100644 --- a/classstdex_1_1parser_1_1basic__css__comment.html +++ b/classstdex_1_1parser_1_1basic__css__comment.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__import-members.html b/classstdex_1_1parser_1_1basic__css__import-members.html index e9bc8be79..f23b78a95 100644 --- a/classstdex_1_1parser_1_1basic__css__import-members.html +++ b/classstdex_1_1parser_1_1basic__css__import-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__import.html b/classstdex_1_1parser_1_1basic__css__import.html index 3643d0071..c9f8bb27e 100644 --- a/classstdex_1_1parser_1_1basic__css__import.html +++ b/classstdex_1_1parser_1_1basic__css__import.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__string-members.html b/classstdex_1_1parser_1_1basic__css__string-members.html index 831d1858f..048803bce 100644 --- a/classstdex_1_1parser_1_1basic__css__string-members.html +++ b/classstdex_1_1parser_1_1basic__css__string-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__string.html b/classstdex_1_1parser_1_1basic__css__string.html index bfb458dc9..88ba6a417 100644 --- a/classstdex_1_1parser_1_1basic__css__string.html +++ b/classstdex_1_1parser_1_1basic__css__string.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__css__uri-members.html b/classstdex_1_1parser_1_1basic__css__uri-members.html index f327d1cdb..0a77e2b8f 100644 --- a/classstdex_1_1parser_1_1basic__css__uri-members.html +++ b/classstdex_1_1parser_1_1basic__css__uri-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__css__uri.html b/classstdex_1_1parser_1_1basic__css__uri.html index b0f949da8..0da3f037b 100644 --- a/classstdex_1_1parser_1_1basic__css__uri.html +++ b/classstdex_1_1parser_1_1basic__css__uri.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__cu-members.html b/classstdex_1_1parser_1_1basic__cu-members.html index 6eaa1e54a..463fb93a2 100644 --- a/classstdex_1_1parser_1_1basic__cu-members.html +++ b/classstdex_1_1parser_1_1basic__cu-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__cu.html b/classstdex_1_1parser_1_1basic__cu.html index c108f060b..7ddc67888 100644 --- a/classstdex_1_1parser_1_1basic__cu.html +++ b/classstdex_1_1parser_1_1basic__cu.html @@ -200,7 +200,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__cu__set-members.html b/classstdex_1_1parser_1_1basic__cu__set-members.html index 3a1dda9a9..bf0f6b576 100644 --- a/classstdex_1_1parser_1_1basic__cu__set-members.html +++ b/classstdex_1_1parser_1_1basic__cu__set-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__cu__set.html b/classstdex_1_1parser_1_1basic__cu__set.html index c0a9d7140..7aeab8049 100644 --- a/classstdex_1_1parser_1_1basic__cu__set.html +++ b/classstdex_1_1parser_1_1basic__cu__set.html @@ -209,7 +209,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__date-members.html b/classstdex_1_1parser_1_1basic__date-members.html index 4078daf83..c96d6ed03 100644 --- a/classstdex_1_1parser_1_1basic__date-members.html +++ b/classstdex_1_1parser_1_1basic__date-members.html @@ -103,7 +103,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__date.html b/classstdex_1_1parser_1_1basic__date.html index d0ba9efd7..f56191625 100644 --- a/classstdex_1_1parser_1_1basic__date.html +++ b/classstdex_1_1parser_1_1basic__date.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__dns__domain__char-members.html b/classstdex_1_1parser_1_1basic__dns__domain__char-members.html index 1db9e628d..19daafbea 100644 --- a/classstdex_1_1parser_1_1basic__dns__domain__char-members.html +++ b/classstdex_1_1parser_1_1basic__dns__domain__char-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__dns__domain__char.html b/classstdex_1_1parser_1_1basic__dns__domain__char.html index 0b819d26a..6ff347b07 100644 --- a/classstdex_1_1parser_1_1basic__dns__domain__char.html +++ b/classstdex_1_1parser_1_1basic__dns__domain__char.html @@ -202,7 +202,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__dns__name-members.html b/classstdex_1_1parser_1_1basic__dns__name-members.html index 0eb30ec67..7b22985e2 100644 --- a/classstdex_1_1parser_1_1basic__dns__name-members.html +++ b/classstdex_1_1parser_1_1basic__dns__name-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__dns__name.html b/classstdex_1_1parser_1_1basic__dns__name.html index 9bdca5036..0dcd4d05d 100644 --- a/classstdex_1_1parser_1_1basic__dns__name.html +++ b/classstdex_1_1parser_1_1basic__dns__name.html @@ -204,7 +204,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__email__address-members.html b/classstdex_1_1parser_1_1basic__email__address-members.html index 40370df5c..8d6409329 100644 --- a/classstdex_1_1parser_1_1basic__email__address-members.html +++ b/classstdex_1_1parser_1_1basic__email__address-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__email__address.html b/classstdex_1_1parser_1_1basic__email__address.html index 05f3f69c5..5c119cc94 100644 --- a/classstdex_1_1parser_1_1basic__email__address.html +++ b/classstdex_1_1parser_1_1basic__email__address.html @@ -244,7 +244,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__emoticon-members.html b/classstdex_1_1parser_1_1basic__emoticon-members.html index bcae74e4f..eb463f461 100644 --- a/classstdex_1_1parser_1_1basic__emoticon-members.html +++ b/classstdex_1_1parser_1_1basic__emoticon-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__emoticon.html b/classstdex_1_1parser_1_1basic__emoticon.html index c2d61b852..3cbf6b2e3 100644 --- a/classstdex_1_1parser_1_1basic__emoticon.html +++ b/classstdex_1_1parser_1_1basic__emoticon.html @@ -242,7 +242,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__eol-members.html b/classstdex_1_1parser_1_1basic__eol-members.html index 07eaaeb6e..f49bfd60f 100644 --- a/classstdex_1_1parser_1_1basic__eol-members.html +++ b/classstdex_1_1parser_1_1basic__eol-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__eol.html b/classstdex_1_1parser_1_1basic__eol.html index 9019a3576..1a3d87a8e 100644 --- a/classstdex_1_1parser_1_1basic__eol.html +++ b/classstdex_1_1parser_1_1basic__eol.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__fraction-members.html b/classstdex_1_1parser_1_1basic__fraction-members.html index 74009b840..536a21345 100644 --- a/classstdex_1_1parser_1_1basic__fraction-members.html +++ b/classstdex_1_1parser_1_1basic__fraction-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__fraction.html b/classstdex_1_1parser_1_1basic__fraction.html index 0340f96ec..7cd577e08 100644 --- a/classstdex_1_1parser_1_1basic__fraction.html +++ b/classstdex_1_1parser_1_1basic__fraction.html @@ -231,7 +231,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html index d7165c1d4..9806f941e 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__end-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html index 20443a076..859c76036 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__end.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html index 720e65d75..0167dabe9 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__start-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html b/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html index 3662b608f..b4e5f28cb 100644 --- a/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html +++ b/classstdex_1_1parser_1_1basic__html__declaration__condition__start.html @@ -225,7 +225,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__ident-members.html b/classstdex_1_1parser_1_1basic__html__ident-members.html index b555b498e..b059478e3 100644 --- a/classstdex_1_1parser_1_1basic__html__ident-members.html +++ b/classstdex_1_1parser_1_1basic__html__ident-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__ident.html b/classstdex_1_1parser_1_1basic__html__ident.html index 06e215cc7..daeff05f1 100644 --- a/classstdex_1_1parser_1_1basic__html__ident.html +++ b/classstdex_1_1parser_1_1basic__html__ident.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__tag-members.html b/classstdex_1_1parser_1_1basic__html__tag-members.html index 317093905..fce9aa36b 100644 --- a/classstdex_1_1parser_1_1basic__html__tag-members.html +++ b/classstdex_1_1parser_1_1basic__html__tag-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__tag.html b/classstdex_1_1parser_1_1basic__html__tag.html index eb711a3d3..473bc8ef9 100644 --- a/classstdex_1_1parser_1_1basic__html__tag.html +++ b/classstdex_1_1parser_1_1basic__html__tag.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__html__value-members.html b/classstdex_1_1parser_1_1basic__html__value-members.html index 639b50e85..99278ae70 100644 --- a/classstdex_1_1parser_1_1basic__html__value-members.html +++ b/classstdex_1_1parser_1_1basic__html__value-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__html__value.html b/classstdex_1_1parser_1_1basic__html__value.html index 627ccd5a9..858c24d36 100644 --- a/classstdex_1_1parser_1_1basic__html__value.html +++ b/classstdex_1_1parser_1_1basic__html__value.html @@ -223,7 +223,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__iban-members.html b/classstdex_1_1parser_1_1basic__iban-members.html index c80cf2e34..fd51c498e 100644 --- a/classstdex_1_1parser_1_1basic__iban-members.html +++ b/classstdex_1_1parser_1_1basic__iban-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__iban.html b/classstdex_1_1parser_1_1basic__iban.html index 0d573a4d4..ce1947641 100644 --- a/classstdex_1_1parser_1_1basic__iban.html +++ b/classstdex_1_1parser_1_1basic__iban.html @@ -243,7 +243,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer-members.html b/classstdex_1_1parser_1_1basic__integer-members.html index d78881729..1ac71be14 100644 --- a/classstdex_1_1parser_1_1basic__integer-members.html +++ b/classstdex_1_1parser_1_1basic__integer-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer.html b/classstdex_1_1parser_1_1basic__integer.html index 5ff5f8ab6..b67fc2eb0 100644 --- a/classstdex_1_1parser_1_1basic__integer.html +++ b/classstdex_1_1parser_1_1basic__integer.html @@ -184,7 +184,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer10-members.html b/classstdex_1_1parser_1_1basic__integer10-members.html index 95342804a..917456f5e 100644 --- a/classstdex_1_1parser_1_1basic__integer10-members.html +++ b/classstdex_1_1parser_1_1basic__integer10-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer10.html b/classstdex_1_1parser_1_1basic__integer10.html index b0a11c798..5771f743c 100644 --- a/classstdex_1_1parser_1_1basic__integer10.html +++ b/classstdex_1_1parser_1_1basic__integer10.html @@ -233,7 +233,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer10ts-members.html b/classstdex_1_1parser_1_1basic__integer10ts-members.html index efa1ba307..ef37a6a80 100644 --- a/classstdex_1_1parser_1_1basic__integer10ts-members.html +++ b/classstdex_1_1parser_1_1basic__integer10ts-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer10ts.html b/classstdex_1_1parser_1_1basic__integer10ts.html index 23ef08329..26a354e97 100644 --- a/classstdex_1_1parser_1_1basic__integer10ts.html +++ b/classstdex_1_1parser_1_1basic__integer10ts.html @@ -247,7 +247,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__integer16-members.html b/classstdex_1_1parser_1_1basic__integer16-members.html index 08211af88..6557bb370 100644 --- a/classstdex_1_1parser_1_1basic__integer16-members.html +++ b/classstdex_1_1parser_1_1basic__integer16-members.html @@ -113,7 +113,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__integer16.html b/classstdex_1_1parser_1_1basic__integer16.html index 1f9b33319..256272029 100644 --- a/classstdex_1_1parser_1_1basic__integer16.html +++ b/classstdex_1_1parser_1_1basic__integer16.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv4__address-members.html b/classstdex_1_1parser_1_1basic__ipv4__address-members.html index 2b310bbea..03632f416 100644 --- a/classstdex_1_1parser_1_1basic__ipv4__address-members.html +++ b/classstdex_1_1parser_1_1basic__ipv4__address-members.html @@ -108,7 +108,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv4__address.html b/classstdex_1_1parser_1_1basic__ipv4__address.html index 74bfd7dfd..1682bf0b3 100644 --- a/classstdex_1_1parser_1_1basic__ipv4__address.html +++ b/classstdex_1_1parser_1_1basic__ipv4__address.html @@ -264,7 +264,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv6__address-members.html b/classstdex_1_1parser_1_1basic__ipv6__address-members.html index 0ce9019c2..075692921 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__address-members.html +++ b/classstdex_1_1parser_1_1basic__ipv6__address-members.html @@ -116,7 +116,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv6__address.html b/classstdex_1_1parser_1_1basic__ipv6__address.html index f7e4f1e51..01dfad5cc 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__address.html +++ b/classstdex_1_1parser_1_1basic__ipv6__address.html @@ -289,7 +289,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html index e55374d7d..740ff021d 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html +++ b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html index ab76be45b..a3d5b60b8 100644 --- a/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html +++ b/classstdex_1_1parser_1_1basic__ipv6__scope__id__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__iterations-members.html b/classstdex_1_1parser_1_1basic__iterations-members.html index c714d7e03..9dc244fca 100644 --- a/classstdex_1_1parser_1_1basic__iterations-members.html +++ b/classstdex_1_1parser_1_1basic__iterations-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__iterations.html b/classstdex_1_1parser_1_1basic__iterations.html index 20852df2a..a81f9d4e1 100644 --- a/classstdex_1_1parser_1_1basic__iterations.html +++ b/classstdex_1_1parser_1_1basic__iterations.html @@ -210,7 +210,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__json__string-members.html b/classstdex_1_1parser_1_1basic__json__string-members.html index c37c51edb..5883b74e1 100644 --- a/classstdex_1_1parser_1_1basic__json__string-members.html +++ b/classstdex_1_1parser_1_1basic__json__string-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__json__string.html b/classstdex_1_1parser_1_1basic__json__string.html index 377e571b1..bd27c9aee 100644 --- a/classstdex_1_1parser_1_1basic__json__string.html +++ b/classstdex_1_1parser_1_1basic__json__string.html @@ -259,7 +259,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__mime__type-members.html b/classstdex_1_1parser_1_1basic__mime__type-members.html index 836455ac5..d84e759c3 100644 --- a/classstdex_1_1parser_1_1basic__mime__type-members.html +++ b/classstdex_1_1parser_1_1basic__mime__type-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__mime__type.html b/classstdex_1_1parser_1_1basic__mime__type.html index ed40cf427..8743bd461 100644 --- a/classstdex_1_1parser_1_1basic__mime__type.html +++ b/classstdex_1_1parser_1_1basic__mime__type.html @@ -231,7 +231,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__mixed__numeral-members.html b/classstdex_1_1parser_1_1basic__mixed__numeral-members.html index bc17435ac..84b25a3a3 100644 --- a/classstdex_1_1parser_1_1basic__mixed__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__mixed__numeral-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__mixed__numeral.html b/classstdex_1_1parser_1_1basic__mixed__numeral.html index 0a0cd9915..ec23f5d55 100644 --- a/classstdex_1_1parser_1_1basic__mixed__numeral.html +++ b/classstdex_1_1parser_1_1basic__mixed__numeral.html @@ -246,7 +246,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__monetary__numeral-members.html b/classstdex_1_1parser_1_1basic__monetary__numeral-members.html index fb819d92f..532e88d81 100644 --- a/classstdex_1_1parser_1_1basic__monetary__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__monetary__numeral-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__monetary__numeral.html b/classstdex_1_1parser_1_1basic__monetary__numeral.html index dc5da0d40..d8ddda051 100644 --- a/classstdex_1_1parser_1_1basic__monetary__numeral.html +++ b/classstdex_1_1parser_1_1basic__monetary__numeral.html @@ -250,7 +250,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__noop-members.html b/classstdex_1_1parser_1_1basic__noop-members.html index fbaf53acf..2df2f3759 100644 --- a/classstdex_1_1parser_1_1basic__noop-members.html +++ b/classstdex_1_1parser_1_1basic__noop-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__noop.html b/classstdex_1_1parser_1_1basic__noop.html index 3dce63764..da5904c64 100644 --- a/classstdex_1_1parser_1_1basic__noop.html +++ b/classstdex_1_1parser_1_1basic__noop.html @@ -183,7 +183,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__parser-members.html b/classstdex_1_1parser_1_1basic__parser-members.html index e0771c3e9..a7da97a1f 100644 --- a/classstdex_1_1parser_1_1basic__parser-members.html +++ b/classstdex_1_1parser_1_1basic__parser-members.html @@ -94,7 +94,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__parser.html b/classstdex_1_1parser_1_1basic__parser.html index a7ac6b208..ff3e02013 100644 --- a/classstdex_1_1parser_1_1basic__parser.html +++ b/classstdex_1_1parser_1_1basic__parser.html @@ -251,7 +251,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__permutation-members.html b/classstdex_1_1parser_1_1basic__permutation-members.html index 4c7ea158b..682f4e7db 100644 --- a/classstdex_1_1parser_1_1basic__permutation-members.html +++ b/classstdex_1_1parser_1_1basic__permutation-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__permutation.html b/classstdex_1_1parser_1_1basic__permutation.html index 36c628440..3ed31ff88 100644 --- a/classstdex_1_1parser_1_1basic__permutation.html +++ b/classstdex_1_1parser_1_1basic__permutation.html @@ -211,7 +211,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__phone__number-members.html b/classstdex_1_1parser_1_1basic__phone__number-members.html index 6e5cc557e..6c68901cc 100644 --- a/classstdex_1_1parser_1_1basic__phone__number-members.html +++ b/classstdex_1_1parser_1_1basic__phone__number-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__phone__number.html b/classstdex_1_1parser_1_1basic__phone__number.html index 87ba74a55..5e75ea439 100644 --- a/classstdex_1_1parser_1_1basic__phone__number.html +++ b/classstdex_1_1parser_1_1basic__phone__number.html @@ -245,7 +245,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__punct__cu-members.html b/classstdex_1_1parser_1_1basic__punct__cu-members.html index bc5c374f5..ec076eda4 100644 --- a/classstdex_1_1parser_1_1basic__punct__cu-members.html +++ b/classstdex_1_1parser_1_1basic__punct__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__punct__cu.html b/classstdex_1_1parser_1_1basic__punct__cu.html index 2e4f42cc7..1d63c06d7 100644 --- a/classstdex_1_1parser_1_1basic__punct__cu.html +++ b/classstdex_1_1parser_1_1basic__punct__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__roman__numeral-members.html b/classstdex_1_1parser_1_1basic__roman__numeral-members.html index 42b413729..2f7a8c794 100644 --- a/classstdex_1_1parser_1_1basic__roman__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__roman__numeral-members.html @@ -106,7 +106,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__roman__numeral.html b/classstdex_1_1parser_1_1basic__roman__numeral.html index 0fee3571a..963ddd7be 100644 --- a/classstdex_1_1parser_1_1basic__roman__numeral.html +++ b/classstdex_1_1parser_1_1basic__roman__numeral.html @@ -230,7 +230,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__scientific__numeral-members.html b/classstdex_1_1parser_1_1basic__scientific__numeral-members.html index 7bfda8d7b..b78769b8c 100644 --- a/classstdex_1_1parser_1_1basic__scientific__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__scientific__numeral-members.html @@ -106,7 +106,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__scientific__numeral.html b/classstdex_1_1parser_1_1basic__scientific__numeral.html index 76db57a62..bb71c1d3c 100644 --- a/classstdex_1_1parser_1_1basic__scientific__numeral.html +++ b/classstdex_1_1parser_1_1basic__scientific__numeral.html @@ -266,7 +266,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__score-members.html b/classstdex_1_1parser_1_1basic__score-members.html index 9b27948a7..93fa6470a 100644 --- a/classstdex_1_1parser_1_1basic__score-members.html +++ b/classstdex_1_1parser_1_1basic__score-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__score.html b/classstdex_1_1parser_1_1basic__score.html index 67a6944ac..41b912254 100644 --- a/classstdex_1_1parser_1_1basic__score.html +++ b/classstdex_1_1parser_1_1basic__score.html @@ -235,7 +235,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__sequence-members.html b/classstdex_1_1parser_1_1basic__sequence-members.html index 5e6c8eca6..5a3109cd1 100644 --- a/classstdex_1_1parser_1_1basic__sequence-members.html +++ b/classstdex_1_1parser_1_1basic__sequence-members.html @@ -100,7 +100,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__sequence.html b/classstdex_1_1parser_1_1basic__sequence.html index 780b05f95..26a1753ba 100644 --- a/classstdex_1_1parser_1_1basic__sequence.html +++ b/classstdex_1_1parser_1_1basic__sequence.html @@ -208,7 +208,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__set-members.html b/classstdex_1_1parser_1_1basic__set-members.html index 92c8f1bc6..06cde310b 100644 --- a/classstdex_1_1parser_1_1basic__set-members.html +++ b/classstdex_1_1parser_1_1basic__set-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__set.html b/classstdex_1_1parser_1_1basic__set.html index a413c1563..b849d8ba7 100644 --- a/classstdex_1_1parser_1_1basic__set.html +++ b/classstdex_1_1parser_1_1basic__set.html @@ -222,7 +222,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference-members.html b/classstdex_1_1parser_1_1basic__si__reference-members.html index b32c34f4a..a31b2d95d 100644 --- a/classstdex_1_1parser_1_1basic__si__reference-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference-members.html @@ -105,7 +105,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference.html b/classstdex_1_1parser_1_1basic__si__reference.html index 97e951f40..db80838fb 100644 --- a/classstdex_1_1parser_1_1basic__si__reference.html +++ b/classstdex_1_1parser_1_1basic__si__reference.html @@ -264,7 +264,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html b/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html index 4260942aa..b245d4369 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference__delimiter-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference__delimiter.html b/classstdex_1_1parser_1_1basic__si__reference__delimiter.html index 2424fbb07..2c3bfaab2 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__delimiter.html +++ b/classstdex_1_1parser_1_1basic__si__reference__delimiter.html @@ -191,7 +191,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__si__reference__part-members.html b/classstdex_1_1parser_1_1basic__si__reference__part-members.html index 331816ff9..0f977fb1b 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__part-members.html +++ b/classstdex_1_1parser_1_1basic__si__reference__part-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__si__reference__part.html b/classstdex_1_1parser_1_1basic__si__reference__part.html index 57b05928c..8ffadacde 100644 --- a/classstdex_1_1parser_1_1basic__si__reference__part.html +++ b/classstdex_1_1parser_1_1basic__si__reference__part.html @@ -191,7 +191,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__signed__numeral-members.html b/classstdex_1_1parser_1_1basic__signed__numeral-members.html index 2618b8f3a..cbe3d028a 100644 --- a/classstdex_1_1parser_1_1basic__signed__numeral-members.html +++ b/classstdex_1_1parser_1_1basic__signed__numeral-members.html @@ -99,7 +99,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__signed__numeral.html b/classstdex_1_1parser_1_1basic__signed__numeral.html index b9f838ba8..d7ba0672d 100644 --- a/classstdex_1_1parser_1_1basic__signed__numeral.html +++ b/classstdex_1_1parser_1_1basic__signed__numeral.html @@ -238,7 +238,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__space__cu-members.html b/classstdex_1_1parser_1_1basic__space__cu-members.html index 072006efd..ad23c912e 100644 --- a/classstdex_1_1parser_1_1basic__space__cu-members.html +++ b/classstdex_1_1parser_1_1basic__space__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__space__cu.html b/classstdex_1_1parser_1_1basic__space__cu.html index aeb83360f..f63628d0b 100644 --- a/classstdex_1_1parser_1_1basic__space__cu.html +++ b/classstdex_1_1parser_1_1basic__space__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html b/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html index 229021f37..f2a071597 100644 --- a/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html +++ b/classstdex_1_1parser_1_1basic__space__or__punct__cu-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__space__or__punct__cu.html b/classstdex_1_1parser_1_1basic__space__or__punct__cu.html index d046a4f6e..18ae69550 100644 --- a/classstdex_1_1parser_1_1basic__space__or__punct__cu.html +++ b/classstdex_1_1parser_1_1basic__space__or__punct__cu.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__string-members.html b/classstdex_1_1parser_1_1basic__string-members.html index 2f484ae13..108010cd7 100644 --- a/classstdex_1_1parser_1_1basic__string-members.html +++ b/classstdex_1_1parser_1_1basic__string-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__string.html b/classstdex_1_1parser_1_1basic__string.html index eb6db6839..4aa0ebb60 100644 --- a/classstdex_1_1parser_1_1basic__string.html +++ b/classstdex_1_1parser_1_1basic__string.html @@ -197,7 +197,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__string__branch-members.html b/classstdex_1_1parser_1_1basic__string__branch-members.html index 599c3973a..7a03d6a10 100644 --- a/classstdex_1_1parser_1_1basic__string__branch-members.html +++ b/classstdex_1_1parser_1_1basic__string__branch-members.html @@ -107,7 +107,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__string__branch.html b/classstdex_1_1parser_1_1basic__string__branch.html index 27a9d4e19..43d7928f6 100644 --- a/classstdex_1_1parser_1_1basic__string__branch.html +++ b/classstdex_1_1parser_1_1basic__string__branch.html @@ -189,7 +189,7 @@ class stdex::parser::basic_string_branch< T, T_parser >

Test for a

diff --git a/classstdex_1_1parser_1_1basic__time-members.html b/classstdex_1_1parser_1_1basic__time-members.html index 33a396d51..2935926d4 100644 --- a/classstdex_1_1parser_1_1basic__time-members.html +++ b/classstdex_1_1parser_1_1basic__time-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__time.html b/classstdex_1_1parser_1_1basic__time.html index e9ba47550..43dbc3c4d 100644 --- a/classstdex_1_1parser_1_1basic__time.html +++ b/classstdex_1_1parser_1_1basic__time.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url-members.html b/classstdex_1_1parser_1_1basic__url-members.html index 148e34619..ebeaf9574 100644 --- a/classstdex_1_1parser_1_1basic__url-members.html +++ b/classstdex_1_1parser_1_1basic__url-members.html @@ -111,7 +111,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url.html b/classstdex_1_1parser_1_1basic__url.html index b63e20fb7..991037767 100644 --- a/classstdex_1_1parser_1_1basic__url.html +++ b/classstdex_1_1parser_1_1basic__url.html @@ -271,7 +271,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__password__char-members.html b/classstdex_1_1parser_1_1basic__url__password__char-members.html index 7e1e7bd8f..2b5cb8e50 100644 --- a/classstdex_1_1parser_1_1basic__url__password__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__password__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__password__char.html b/classstdex_1_1parser_1_1basic__url__password__char.html index 7cc67aae1..cfc41e1d8 100644 --- a/classstdex_1_1parser_1_1basic__url__password__char.html +++ b/classstdex_1_1parser_1_1basic__url__password__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__path-members.html b/classstdex_1_1parser_1_1basic__url__path-members.html index 1ac6a5d67..a8f417b04 100644 --- a/classstdex_1_1parser_1_1basic__url__path-members.html +++ b/classstdex_1_1parser_1_1basic__url__path-members.html @@ -101,7 +101,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__path.html b/classstdex_1_1parser_1_1basic__url__path.html index 60af6f235..81ced6ad1 100644 --- a/classstdex_1_1parser_1_1basic__url__path.html +++ b/classstdex_1_1parser_1_1basic__url__path.html @@ -241,7 +241,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__path__char-members.html b/classstdex_1_1parser_1_1basic__url__path__char-members.html index 1b5ef8ab6..95aa73c89 100644 --- a/classstdex_1_1parser_1_1basic__url__path__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__path__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__path__char.html b/classstdex_1_1parser_1_1basic__url__path__char.html index 31c570351..f33f68d20 100644 --- a/classstdex_1_1parser_1_1basic__url__path__char.html +++ b/classstdex_1_1parser_1_1basic__url__path__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1basic__url__username__char-members.html b/classstdex_1_1parser_1_1basic__url__username__char-members.html index b15575f0b..0c809a2b3 100644 --- a/classstdex_1_1parser_1_1basic__url__username__char-members.html +++ b/classstdex_1_1parser_1_1basic__url__username__char-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1basic__url__username__char.html b/classstdex_1_1parser_1_1basic__url__username__char.html index 4f0d5e574..43c9a11de 100644 --- a/classstdex_1_1parser_1_1basic__url__username__char.html +++ b/classstdex_1_1parser_1_1basic__url__username__char.html @@ -190,7 +190,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1http__agent-members.html b/classstdex_1_1parser_1_1http__agent-members.html index 167e40594..b05587017 100644 --- a/classstdex_1_1parser_1_1http__agent-members.html +++ b/classstdex_1_1parser_1_1http__agent-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__agent.html b/classstdex_1_1parser_1_1http__agent.html index 1de8051dd..b50d3f286 100644 --- a/classstdex_1_1parser_1_1http__agent.html +++ b/classstdex_1_1parser_1_1http__agent.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__any__type-members.html b/classstdex_1_1parser_1_1http__any__type-members.html index a1bb58ad5..31d8d00e3 100644 --- a/classstdex_1_1parser_1_1http__any__type-members.html +++ b/classstdex_1_1parser_1_1http__any__type-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__any__type.html b/classstdex_1_1parser_1_1http__any__type.html index 90511152f..10d7557ca 100644 --- a/classstdex_1_1parser_1_1http__any__type.html +++ b/classstdex_1_1parser_1_1http__any__type.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__asterisk-members.html b/classstdex_1_1parser_1_1http__asterisk-members.html index 0cccec46e..f07d24b48 100644 --- a/classstdex_1_1parser_1_1http__asterisk-members.html +++ b/classstdex_1_1parser_1_1http__asterisk-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__asterisk.html b/classstdex_1_1parser_1_1http__asterisk.html index 385c3bfd6..4791c9d6c 100644 --- a/classstdex_1_1parser_1_1http__asterisk.html +++ b/classstdex_1_1parser_1_1http__asterisk.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__cookie-members.html b/classstdex_1_1parser_1_1http__cookie-members.html index ca64bd8b3..c3ae4f25a 100644 --- a/classstdex_1_1parser_1_1http__cookie-members.html +++ b/classstdex_1_1parser_1_1http__cookie-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__cookie.html b/classstdex_1_1parser_1_1http__cookie.html index a15bee46b..2eac895fd 100644 --- a/classstdex_1_1parser_1_1http__cookie.html +++ b/classstdex_1_1parser_1_1http__cookie.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__cookie__parameter-members.html b/classstdex_1_1parser_1_1http__cookie__parameter-members.html index 21c220b69..92005dd16 100644 --- a/classstdex_1_1parser_1_1http__cookie__parameter-members.html +++ b/classstdex_1_1parser_1_1http__cookie__parameter-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__cookie__parameter.html b/classstdex_1_1parser_1_1http__cookie__parameter.html index 39873d1bd..ebe9b7ada 100644 --- a/classstdex_1_1parser_1_1http__cookie__parameter.html +++ b/classstdex_1_1parser_1_1http__cookie__parameter.html @@ -188,7 +188,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__header-members.html b/classstdex_1_1parser_1_1http__header-members.html index 9323fad6a..0d87b7afb 100644 --- a/classstdex_1_1parser_1_1http__header-members.html +++ b/classstdex_1_1parser_1_1http__header-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__header.html b/classstdex_1_1parser_1_1http__header.html index 14bfe9d83..ea3210195 100644 --- a/classstdex_1_1parser_1_1http__header.html +++ b/classstdex_1_1parser_1_1http__header.html @@ -188,7 +188,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__language-members.html b/classstdex_1_1parser_1_1http__language-members.html index 0387b4938..35ee8e03e 100644 --- a/classstdex_1_1parser_1_1http__language-members.html +++ b/classstdex_1_1parser_1_1http__language-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__language.html b/classstdex_1_1parser_1_1http__language.html index 57d1faa8e..43e749f24 100644 --- a/classstdex_1_1parser_1_1http__language.html +++ b/classstdex_1_1parser_1_1http__language.html @@ -181,7 +181,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__line__break-members.html b/classstdex_1_1parser_1_1http__line__break-members.html index 1a973540b..61186a39d 100644 --- a/classstdex_1_1parser_1_1http__line__break-members.html +++ b/classstdex_1_1parser_1_1http__line__break-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__line__break.html b/classstdex_1_1parser_1_1http__line__break.html index e51a384ed..7e37477e8 100644 --- a/classstdex_1_1parser_1_1http__line__break.html +++ b/classstdex_1_1parser_1_1http__line__break.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__media__range-members.html b/classstdex_1_1parser_1_1http__media__range-members.html index 5b43eeba6..7a1166d9b 100644 --- a/classstdex_1_1parser_1_1http__media__range-members.html +++ b/classstdex_1_1parser_1_1http__media__range-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__media__range.html b/classstdex_1_1parser_1_1http__media__range.html index 12b9c6111..aaee4567b 100644 --- a/classstdex_1_1parser_1_1http__media__range.html +++ b/classstdex_1_1parser_1_1http__media__range.html @@ -189,7 +189,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__media__type-members.html b/classstdex_1_1parser_1_1http__media__type-members.html index 443182e09..357b6b560 100644 --- a/classstdex_1_1parser_1_1http__media__type-members.html +++ b/classstdex_1_1parser_1_1http__media__type-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__media__type.html b/classstdex_1_1parser_1_1http__media__type.html index 3655d020f..dd979f35c 100644 --- a/classstdex_1_1parser_1_1http__media__type.html +++ b/classstdex_1_1parser_1_1http__media__type.html @@ -233,7 +233,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__parameter-members.html b/classstdex_1_1parser_1_1http__parameter-members.html index 232301766..a35ee7744 100644 --- a/classstdex_1_1parser_1_1http__parameter-members.html +++ b/classstdex_1_1parser_1_1http__parameter-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__parameter.html b/classstdex_1_1parser_1_1http__parameter.html index fe7cbd560..94f9e2575 100644 --- a/classstdex_1_1parser_1_1http__parameter.html +++ b/classstdex_1_1parser_1_1http__parameter.html @@ -190,7 +190,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__protocol-members.html b/classstdex_1_1parser_1_1http__protocol-members.html index d968a3b0f..df7de36f6 100644 --- a/classstdex_1_1parser_1_1http__protocol-members.html +++ b/classstdex_1_1parser_1_1http__protocol-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__protocol.html b/classstdex_1_1parser_1_1http__protocol.html index 519d215c4..1df54734a 100644 --- a/classstdex_1_1parser_1_1http__protocol.html +++ b/classstdex_1_1parser_1_1http__protocol.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__quoted__string-members.html b/classstdex_1_1parser_1_1http__quoted__string-members.html index 669275509..269869965 100644 --- a/classstdex_1_1parser_1_1http__quoted__string-members.html +++ b/classstdex_1_1parser_1_1http__quoted__string-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__quoted__string.html b/classstdex_1_1parser_1_1http__quoted__string.html index 3637e4765..c3bd47548 100644 --- a/classstdex_1_1parser_1_1http__quoted__string.html +++ b/classstdex_1_1parser_1_1http__quoted__string.html @@ -186,7 +186,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__request-members.html b/classstdex_1_1parser_1_1http__request-members.html index e9773432f..c68e179f2 100644 --- a/classstdex_1_1parser_1_1http__request-members.html +++ b/classstdex_1_1parser_1_1http__request-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__request.html b/classstdex_1_1parser_1_1http__request.html index 0bf40940f..95d1a19bb 100644 --- a/classstdex_1_1parser_1_1http__request.html +++ b/classstdex_1_1parser_1_1http__request.html @@ -194,7 +194,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__space-members.html b/classstdex_1_1parser_1_1http__space-members.html index 318b2d4b3..360dcb1c7 100644 --- a/classstdex_1_1parser_1_1http__space-members.html +++ b/classstdex_1_1parser_1_1http__space-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__space.html b/classstdex_1_1parser_1_1http__space.html index f5ee469a2..a6af76e84 100644 --- a/classstdex_1_1parser_1_1http__space.html +++ b/classstdex_1_1parser_1_1http__space.html @@ -150,7 +150,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1http__text__char-members.html b/classstdex_1_1parser_1_1http__text__char-members.html index bf9d3a685..7eb22c5ff 100644 --- a/classstdex_1_1parser_1_1http__text__char-members.html +++ b/classstdex_1_1parser_1_1http__text__char-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__text__char.html b/classstdex_1_1parser_1_1http__text__char.html index 11877590d..dda407524 100644 --- a/classstdex_1_1parser_1_1http__text__char.html +++ b/classstdex_1_1parser_1_1http__text__char.html @@ -150,7 +150,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1http__token-members.html b/classstdex_1_1parser_1_1http__token-members.html index 99277454c..1fc8cb555 100644 --- a/classstdex_1_1parser_1_1http__token-members.html +++ b/classstdex_1_1parser_1_1http__token-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__token.html b/classstdex_1_1parser_1_1http__token.html index 5130a0798..bcfab8fe5 100644 --- a/classstdex_1_1parser_1_1http__token.html +++ b/classstdex_1_1parser_1_1http__token.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url-members.html b/classstdex_1_1parser_1_1http__url-members.html index 4e1732323..9c9b09d07 100644 --- a/classstdex_1_1parser_1_1http__url-members.html +++ b/classstdex_1_1parser_1_1http__url-members.html @@ -93,7 +93,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url.html b/classstdex_1_1parser_1_1http__url.html index 2f6ddf6c7..6d0b0cbd7 100644 --- a/classstdex_1_1parser_1_1http__url.html +++ b/classstdex_1_1parser_1_1http__url.html @@ -193,7 +193,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__parameter-members.html b/classstdex_1_1parser_1_1http__url__parameter-members.html index 59207f8fa..2a8d6e160 100644 --- a/classstdex_1_1parser_1_1http__url__parameter-members.html +++ b/classstdex_1_1parser_1_1http__url__parameter-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__parameter.html b/classstdex_1_1parser_1_1http__url__parameter.html index fd3cf6946..fbf92ee9f 100644 --- a/classstdex_1_1parser_1_1http__url__parameter.html +++ b/classstdex_1_1parser_1_1http__url__parameter.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__path-members.html b/classstdex_1_1parser_1_1http__url__path-members.html index 5e418c553..a30735ade 100644 --- a/classstdex_1_1parser_1_1http__url__path-members.html +++ b/classstdex_1_1parser_1_1http__url__path-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__path.html b/classstdex_1_1parser_1_1http__url__path.html index efa67fff4..2b4751001 100644 --- a/classstdex_1_1parser_1_1http__url__path.html +++ b/classstdex_1_1parser_1_1http__url__path.html @@ -182,7 +182,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__path__segment-members.html b/classstdex_1_1parser_1_1http__url__path__segment-members.html index 4ad53598c..5af2a079e 100644 --- a/classstdex_1_1parser_1_1http__url__path__segment-members.html +++ b/classstdex_1_1parser_1_1http__url__path__segment-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__path__segment.html b/classstdex_1_1parser_1_1http__url__path__segment.html index 142158d1c..82077bf97 100644 --- a/classstdex_1_1parser_1_1http__url__path__segment.html +++ b/classstdex_1_1parser_1_1http__url__path__segment.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__port-members.html b/classstdex_1_1parser_1_1http__url__port-members.html index 79535a8c0..7d2804f08 100644 --- a/classstdex_1_1parser_1_1http__url__port-members.html +++ b/classstdex_1_1parser_1_1http__url__port-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__port.html b/classstdex_1_1parser_1_1http__url__port.html index fe8c1d189..f8a696874 100644 --- a/classstdex_1_1parser_1_1http__url__port.html +++ b/classstdex_1_1parser_1_1http__url__port.html @@ -184,7 +184,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__url__server-members.html b/classstdex_1_1parser_1_1http__url__server-members.html index 0ca9b3119..161364987 100644 --- a/classstdex_1_1parser_1_1http__url__server-members.html +++ b/classstdex_1_1parser_1_1http__url__server-members.html @@ -87,7 +87,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__url__server.html b/classstdex_1_1parser_1_1http__url__server.html index 5a8bccc6f..0afa6ef8d 100644 --- a/classstdex_1_1parser_1_1http__url__server.html +++ b/classstdex_1_1parser_1_1http__url__server.html @@ -143,7 +143,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__value-members.html b/classstdex_1_1parser_1_1http__value-members.html index bdd5473cb..2a7c719c3 100644 --- a/classstdex_1_1parser_1_1http__value-members.html +++ b/classstdex_1_1parser_1_1http__value-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__value.html b/classstdex_1_1parser_1_1http__value.html index 2270714f7..76990b711 100644 --- a/classstdex_1_1parser_1_1http__value.html +++ b/classstdex_1_1parser_1_1http__value.html @@ -186,7 +186,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__value__collection-members.html b/classstdex_1_1parser_1_1http__value__collection-members.html index 68d2ffa89..c6e0ba644 100644 --- a/classstdex_1_1parser_1_1http__value__collection-members.html +++ b/classstdex_1_1parser_1_1http__value__collection-members.html @@ -86,7 +86,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__value__collection.html b/classstdex_1_1parser_1_1http__value__collection.html index 9540eb64d..0b53f07c6 100644 --- a/classstdex_1_1parser_1_1http__value__collection.html +++ b/classstdex_1_1parser_1_1http__value__collection.html @@ -109,7 +109,7 @@ class stdex::parser::http_value_collection< KEY, T >

Collection of

diff --git a/classstdex_1_1parser_1_1http__weight-members.html b/classstdex_1_1parser_1_1http__weight-members.html index 06a19dc85..283b7a7ed 100644 --- a/classstdex_1_1parser_1_1http__weight-members.html +++ b/classstdex_1_1parser_1_1http__weight-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__weight.html b/classstdex_1_1parser_1_1http__weight.html index eeb57327d..f71fd3581 100644 --- a/classstdex_1_1parser_1_1http__weight.html +++ b/classstdex_1_1parser_1_1http__weight.html @@ -185,7 +185,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1http__weighted__value-members.html b/classstdex_1_1parser_1_1http__weighted__value-members.html index c79b02198..3b0eea888 100644 --- a/classstdex_1_1parser_1_1http__weighted__value-members.html +++ b/classstdex_1_1parser_1_1http__weighted__value-members.html @@ -92,7 +92,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1http__weighted__value.html b/classstdex_1_1parser_1_1http__weighted__value.html index b8828ca48..e1e2e13d0 100644 --- a/classstdex_1_1parser_1_1http__weighted__value.html +++ b/classstdex_1_1parser_1_1http__weighted__value.html @@ -193,7 +193,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1parser__collection-members.html b/classstdex_1_1parser_1_1parser__collection-members.html index 28d7f9759..4e105617f 100644 --- a/classstdex_1_1parser_1_1parser__collection-members.html +++ b/classstdex_1_1parser_1_1parser__collection-members.html @@ -98,7 +98,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1parser__collection.html b/classstdex_1_1parser_1_1parser__collection.html index d8200b23b..34f038e9c 100644 --- a/classstdex_1_1parser_1_1parser__collection.html +++ b/classstdex_1_1parser_1_1parser__collection.html @@ -193,7 +193,7 @@ template<clas diff --git a/classstdex_1_1parser_1_1sgml__any__cp-members.html b/classstdex_1_1parser_1_1sgml__any__cp-members.html index 22da3bc7c..f7914b6c8 100644 --- a/classstdex_1_1parser_1_1sgml__any__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__any__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__any__cp.html b/classstdex_1_1parser_1_1sgml__any__cp.html index 868e6cd55..4c117195f 100644 --- a/classstdex_1_1parser_1_1sgml__any__cp.html +++ b/classstdex_1_1parser_1_1sgml__any__cp.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__cp-members.html b/classstdex_1_1parser_1_1sgml__cp-members.html index 6fb50b25b..bfac17a06 100644 --- a/classstdex_1_1parser_1_1sgml__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__cp-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__cp.html b/classstdex_1_1parser_1_1sgml__cp.html index 5939bdeed..7e4904edc 100644 --- a/classstdex_1_1parser_1_1sgml__cp.html +++ b/classstdex_1_1parser_1_1sgml__cp.html @@ -160,7 +160,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__cp__set-members.html b/classstdex_1_1parser_1_1sgml__cp__set-members.html index 517caf746..a377ceb02 100644 --- a/classstdex_1_1parser_1_1sgml__cp__set-members.html +++ b/classstdex_1_1parser_1_1sgml__cp__set-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__cp__set.html b/classstdex_1_1parser_1_1sgml__cp__set.html index c8e557918..03147e79c 100644 --- a/classstdex_1_1parser_1_1sgml__cp__set.html +++ b/classstdex_1_1parser_1_1sgml__cp__set.html @@ -172,7 +172,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html b/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html index ce28f9c70..e891d9f8e 100644 --- a/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html +++ b/classstdex_1_1parser_1_1sgml__dns__domain__char-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__dns__domain__char.html b/classstdex_1_1parser_1_1sgml__dns__domain__char.html index 60773bdca..5c2fc8f06 100644 --- a/classstdex_1_1parser_1_1sgml__dns__domain__char.html +++ b/classstdex_1_1parser_1_1sgml__dns__domain__char.html @@ -167,7 +167,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html index 131c0f15e..e856f82b0 100644 --- a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html +++ b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html index b6023ae9c..171671775 100644 --- a/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html +++ b/classstdex_1_1parser_1_1sgml__ipv6__scope__id__char.html @@ -150,7 +150,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__punct__cp-members.html b/classstdex_1_1parser_1_1sgml__punct__cp-members.html index 590d22aec..dfb64c93b 100644 --- a/classstdex_1_1parser_1_1sgml__punct__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__punct__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__punct__cp.html b/classstdex_1_1parser_1_1sgml__punct__cp.html index ad3c71682..d20a9226c 100644 --- a/classstdex_1_1parser_1_1sgml__punct__cp.html +++ b/classstdex_1_1parser_1_1sgml__punct__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__space__cp-members.html b/classstdex_1_1parser_1_1sgml__space__cp-members.html index d15c60df1..0a91aefd5 100644 --- a/classstdex_1_1parser_1_1sgml__space__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__space__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__space__cp.html b/classstdex_1_1parser_1_1sgml__space__cp.html index 1cb67687c..9007ffcb3 100644 --- a/classstdex_1_1parser_1_1sgml__space__cp.html +++ b/classstdex_1_1parser_1_1sgml__space__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html b/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html index 2051868d1..6a968fe88 100644 --- a/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html +++ b/classstdex_1_1parser_1_1sgml__space__or__punct__cp-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html b/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html index 2aa5c058c..b923fb02c 100644 --- a/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html +++ b/classstdex_1_1parser_1_1sgml__space__or__punct__cp.html @@ -162,7 +162,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__string-members.html b/classstdex_1_1parser_1_1sgml__string-members.html index ffadf712a..5d1dec195 100644 --- a/classstdex_1_1parser_1_1sgml__string-members.html +++ b/classstdex_1_1parser_1_1sgml__string-members.html @@ -89,7 +89,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__string.html b/classstdex_1_1parser_1_1sgml__string.html index 929528712..9ba035b16 100644 --- a/classstdex_1_1parser_1_1sgml__string.html +++ b/classstdex_1_1parser_1_1sgml__string.html @@ -157,7 +157,7 @@ Additional Inherited Members diff --git a/classstdex_1_1parser_1_1sgml__url__password__char-members.html b/classstdex_1_1parser_1_1sgml__url__password__char-members.html index 244f7da71..af881832c 100644 --- a/classstdex_1_1parser_1_1sgml__url__password__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__password__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__password__char.html b/classstdex_1_1parser_1_1sgml__url__password__char.html index fc76168f3..aaac523f2 100644 --- a/classstdex_1_1parser_1_1sgml__url__password__char.html +++ b/classstdex_1_1parser_1_1sgml__url__password__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__url__path__char-members.html b/classstdex_1_1parser_1_1sgml__url__path__char-members.html index abcf864f8..a5899d358 100644 --- a/classstdex_1_1parser_1_1sgml__url__path__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__path__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__path__char.html b/classstdex_1_1parser_1_1sgml__url__path__char.html index 42595341a..f3628ee73 100644 --- a/classstdex_1_1parser_1_1sgml__url__path__char.html +++ b/classstdex_1_1parser_1_1sgml__url__path__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1parser_1_1sgml__url__username__char-members.html b/classstdex_1_1parser_1_1sgml__url__username__char-members.html index c3179ddee..4e6799bb7 100644 --- a/classstdex_1_1parser_1_1sgml__url__username__char-members.html +++ b/classstdex_1_1parser_1_1sgml__url__username__char-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1parser_1_1sgml__url__username__char.html b/classstdex_1_1parser_1_1sgml__url__username__char.html index 101422df8..11e0af5ed 100644 --- a/classstdex_1_1parser_1_1sgml__url__username__char.html +++ b/classstdex_1_1parser_1_1sgml__url__username__char.html @@ -158,7 +158,7 @@ std::locale m_locale diff --git a/classstdex_1_1pool-members.html b/classstdex_1_1pool-members.html index 89b2fdbdd..5a247c19a 100644 --- a/classstdex_1_1pool-members.html +++ b/classstdex_1_1pool-members.html @@ -82,13 +82,14 @@ $(function() {

This is the complete list of members for stdex::pool< T >, including all inherited members.

- - - + + + +
numaid_t typedef (defined in stdex::pool< T >)stdex::pool< T >
pop(numaid_t numa=numa_node())stdex::pool< T >inline
push(T &&r, numaid_t numa=numa_node())stdex::pool< T >inline
clear()stdex::pool< T >inline
numaid_t typedef (defined in stdex::pool< T >)stdex::pool< T >
pop(numaid_t numa=numa_node())stdex::pool< T >inline
push(T &&r, numaid_t numa=numa_node())stdex::pool< T >inline
diff --git a/classstdex_1_1pool.html b/classstdex_1_1pool.html index 02c835c9a..60979ea21 100644 --- a/classstdex_1_1pool.html +++ b/classstdex_1_1pool.html @@ -103,6 +103,10 @@ Public Member Functions void push (T &&r, numaid_t numa=numa_node())  Adds an item to the pool.
  + +void clear () + Removes all items from the pool.

Detailed Description

template<class T>
@@ -190,7 +194,7 @@ template<class T >
diff --git a/classstdex_1_1progress-members.html b/classstdex_1_1progress-members.html index 04612926b..2f57ed5d4 100644 --- a/classstdex_1_1progress-members.html +++ b/classstdex_1_1progress-members.html @@ -90,7 +90,7 @@ $(function() { diff --git a/classstdex_1_1progress.html b/classstdex_1_1progress.html index 01a3173b9..d6386cc8d 100644 --- a/classstdex_1_1progress.html +++ b/classstdex_1_1progress.html @@ -93,9 +93,10 @@ Inheritance diagram for stdex::progress< T >:
-stdex::global_progress< T > -stdex::lazy_progress< T > -stdex::progress_switcher< T > +stdex::aggregate_progress< T >::worker_progress +stdex::global_progress< T > +stdex::lazy_progress< T > +stdex::progress_switcher< T >
@@ -148,7 +149,7 @@ template<class T >

Query whether user requested abort.

-

Reimplemented in stdex::global_progress< T >.

+

Reimplemented in stdex::global_progress< T >, and stdex::aggregate_progress< T >::worker_progress.

@@ -185,7 +186,7 @@ template<class T > -

Reimplemented in stdex::lazy_progress< T >, and stdex::global_progress< T >.

+

Reimplemented in stdex::lazy_progress< T >, stdex::global_progress< T >, and stdex::aggregate_progress< T >::worker_progress.

@@ -227,7 +228,7 @@ template<class T > -

Reimplemented in stdex::lazy_progress< T >, and stdex::global_progress< T >.

+

Reimplemented in stdex::lazy_progress< T >, stdex::global_progress< T >, and stdex::aggregate_progress< T >::worker_progress.

@@ -264,7 +265,7 @@ template<class T > -

Reimplemented in stdex::global_progress< T >.

+

Reimplemented in stdex::global_progress< T >, and stdex::aggregate_progress< T >::worker_progress.

@@ -301,7 +302,7 @@ template<class T > -

Reimplemented in stdex::global_progress< T >.

+

Reimplemented in stdex::global_progress< T >, and stdex::aggregate_progress< T >::worker_progress.

@@ -311,7 +312,7 @@ template<class T > diff --git a/classstdex_1_1progress.png b/classstdex_1_1progress.png index 29c03cdab..31701d408 100644 Binary files a/classstdex_1_1progress.png and b/classstdex_1_1progress.png differ diff --git a/classstdex_1_1progress__switcher-members.html b/classstdex_1_1progress__switcher-members.html index 3cc214763..34f3fb47e 100644 --- a/classstdex_1_1progress__switcher-members.html +++ b/classstdex_1_1progress__switcher-members.html @@ -85,7 +85,7 @@ $(function() { - + @@ -102,7 +102,7 @@ $(function() {
attach(progress< T > *host)stdex::global_progress< T >inline
cancel()stdex::global_progress< T >inlinevirtual
detach()stdex::global_progress< T >inline
global_progress(progress< T > *host=NULL)stdex::global_progress< T >inline
global_progress(progress< T > *host=nullptr)stdex::global_progress< T >inline
m_global (defined in stdex::global_progress< T >)stdex::global_progress< T >protected
m_host (defined in stdex::global_progress< T >)stdex::global_progress< T >protected
m_host_ref (defined in stdex::progress_switcher< T >)stdex::progress_switcher< T >protected
diff --git a/classstdex_1_1progress__switcher.html b/classstdex_1_1progress__switcher.html index 0c318b6de..327a94d0b 100644 --- a/classstdex_1_1progress__switcher.html +++ b/classstdex_1_1progress__switcher.html @@ -94,7 +94,7 @@ Inheritance diagram for stdex::progress_switcher< T >:
-stdex::global_progress< T > +stdex::global_progress< T > stdex::progress< T >
@@ -105,9 +105,9 @@ Public Member Functions  progress_switcher (progress< T > *&host)   - Public Member Functions inherited from stdex::global_progress< T >global_progress (progress< T > *host=NULL) - Constructs a progress indicator.
-  + global_progress (progress< T > *host=nullptr) + Constructs a progress indicator.
+  void attach (progress< T > *host)  Attach to a host progress indicator.
  @@ -158,14 +158,14 @@ Protected Attributes

Detailed Description

template<class T>
class stdex::progress_switcher< T >

Progress indicator switcher.

-

Use to inject global_progress indicator inplace of another progress indicator.

+

Use to inject global_progress indicator inplace of another progress indicator.


The documentation for this class was generated from the following file: diff --git a/classstdex_1_1ring-members.html b/classstdex_1_1ring-members.html index 5716fb814..738c83dc7 100644 --- a/classstdex_1_1ring-members.html +++ b/classstdex_1_1ring-members.html @@ -102,7 +102,7 @@ $(function() { diff --git a/classstdex_1_1ring.html b/classstdex_1_1ring.html index 03b27cf4e..a4fb492d9 100644 --- a/classstdex_1_1ring.html +++ b/classstdex_1_1ring.html @@ -296,7 +296,7 @@ template<class T , size_t N_cap> diff --git a/classstdex_1_1sha1__hash-members.html b/classstdex_1_1sha1__hash-members.html index 17ea0e46f..13f2f9f41 100644 --- a/classstdex_1_1sha1__hash-members.html +++ b/classstdex_1_1sha1__hash-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1sha1__hash.html b/classstdex_1_1sha1__hash.html index 70217a58e..399bee474 100644 --- a/classstdex_1_1sha1__hash.html +++ b/classstdex_1_1sha1__hash.html @@ -261,7 +261,7 @@ uint32_t m_temp [16] diff --git a/classstdex_1_1spinlock-members.html b/classstdex_1_1spinlock-members.html index 06c7a123a..111bd71cd 100644 --- a/classstdex_1_1spinlock-members.html +++ b/classstdex_1_1spinlock-members.html @@ -88,7 +88,7 @@ $(function() { diff --git a/classstdex_1_1spinlock.html b/classstdex_1_1spinlock.html index 65e339ba4..7f57b7496 100644 --- a/classstdex_1_1spinlock.html +++ b/classstdex_1_1spinlock.html @@ -140,7 +140,7 @@ void unlock () noexcep diff --git a/classstdex_1_1stream_1_1async__reader-members.html b/classstdex_1_1stream_1_1async__reader-members.html index 4fe79b8c5..53bb16873 100644 --- a/classstdex_1_1stream_1_1async__reader-members.html +++ b/classstdex_1_1stream_1_1async__reader-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1async__reader.html b/classstdex_1_1stream_1_1async__reader.html index c685dff17..016f58364 100644 --- a/classstdex_1_1stream_1_1async__reader.html +++ b/classstdex_1_1stream_1_1async__reader.html @@ -405,7 +405,7 @@ template<size_t N_cap = default_async_limit> diff --git a/classstdex_1_1stream_1_1async__writer-members.html b/classstdex_1_1stream_1_1async__writer-members.html index fc7eb9f4b..93e6ece6d 100644 --- a/classstdex_1_1stream_1_1async__writer-members.html +++ b/classstdex_1_1stream_1_1async__writer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1async__writer.html b/classstdex_1_1stream_1_1async__writer.html index aed0767ec..d22172927 100644 --- a/classstdex_1_1stream_1_1async__writer.html +++ b/classstdex_1_1stream_1_1async__writer.html @@ -436,7 +436,7 @@ template<size_t N_cap = default_async_limit> diff --git a/classstdex_1_1stream_1_1basic-members.html b/classstdex_1_1stream_1_1basic-members.html index 24c400261..6fddbe209 100644 --- a/classstdex_1_1stream_1_1basic-members.html +++ b/classstdex_1_1stream_1_1basic-members.html @@ -149,7 +149,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic.html b/classstdex_1_1stream_1_1basic.html index 747a114a9..1bdd432c2 100644 --- a/classstdex_1_1stream_1_1basic.html +++ b/classstdex_1_1stream_1_1basic.html @@ -1255,7 +1255,7 @@ template<class T > diff --git a/classstdex_1_1stream_1_1basic__file-members.html b/classstdex_1_1stream_1_1basic__file-members.html index 36c93f9dd..20312106e 100644 --- a/classstdex_1_1stream_1_1basic__file-members.html +++ b/classstdex_1_1stream_1_1basic__file-members.html @@ -165,7 +165,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic__file.html b/classstdex_1_1stream_1_1basic__file.html index 2c887d71a..bbbd901a3 100644 --- a/classstdex_1_1stream_1_1basic__file.html +++ b/classstdex_1_1stream_1_1basic__file.html @@ -929,7 +929,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1basic__sys-members.html b/classstdex_1_1stream_1_1basic__sys-members.html index 1db4f2908..f371c495e 100644 --- a/classstdex_1_1stream_1_1basic__sys-members.html +++ b/classstdex_1_1stream_1_1basic__sys-members.html @@ -161,7 +161,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1basic__sys.html b/classstdex_1_1stream_1_1basic__sys.html index fe5731c25..39b25bef1 100644 --- a/classstdex_1_1stream_1_1basic__sys.html +++ b/classstdex_1_1stream_1_1basic__sys.html @@ -511,7 +511,7 @@ sys_handle m_h diff --git a/classstdex_1_1stream_1_1buffer-members.html b/classstdex_1_1stream_1_1buffer-members.html index f7163de62..4b73027d7 100644 --- a/classstdex_1_1stream_1_1buffer-members.html +++ b/classstdex_1_1stream_1_1buffer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1buffer.html b/classstdex_1_1stream_1_1buffer.html index 3b413a0b6..9f88f4ec9 100644 --- a/classstdex_1_1stream_1_1buffer.html +++ b/classstdex_1_1stream_1_1buffer.html @@ -473,7 +473,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1buffered__sys-members.html b/classstdex_1_1stream_1_1buffered__sys-members.html index 6b4c339bb..b5de79d69 100644 --- a/classstdex_1_1stream_1_1buffered__sys-members.html +++ b/classstdex_1_1stream_1_1buffered__sys-members.html @@ -158,7 +158,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1buffered__sys.html b/classstdex_1_1stream_1_1buffered__sys.html index b00437a24..b2a9e4ead 100644 --- a/classstdex_1_1stream_1_1buffered__sys.html +++ b/classstdex_1_1stream_1_1buffered__sys.html @@ -363,7 +363,7 @@ void flush_write () diff --git a/classstdex_1_1stream_1_1cache-members.html b/classstdex_1_1stream_1_1cache-members.html index 87553e920..25cf1ac78 100644 --- a/classstdex_1_1stream_1_1cache-members.html +++ b/classstdex_1_1stream_1_1cache-members.html @@ -167,7 +167,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1cache.html b/classstdex_1_1stream_1_1cache.html index 4321fc602..c3fff01ed 100644 --- a/classstdex_1_1stream_1_1cache.html +++ b/classstdex_1_1stream_1_1cache.html @@ -885,7 +885,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1cached__file-members.html b/classstdex_1_1stream_1_1cached__file-members.html index 5c39529f5..13a9c8393 100644 --- a/classstdex_1_1stream_1_1cached__file-members.html +++ b/classstdex_1_1stream_1_1cached__file-members.html @@ -175,7 +175,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1cached__file.html b/classstdex_1_1stream_1_1cached__file.html index dc5d30743..050760690 100644 --- a/classstdex_1_1stream_1_1cached__file.html +++ b/classstdex_1_1stream_1_1cached__file.html @@ -578,7 +578,7 @@ template<class TR = std::char_traits<schar_t>, class AX = std::alloca diff --git a/classstdex_1_1stream_1_1converter-members.html b/classstdex_1_1stream_1_1converter-members.html index a7d10d0fe..fcd8c04d3 100644 --- a/classstdex_1_1stream_1_1converter-members.html +++ b/classstdex_1_1stream_1_1converter-members.html @@ -151,7 +151,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1converter.html b/classstdex_1_1stream_1_1converter.html index c42e7b174..63d05ba1c 100644 --- a/classstdex_1_1stream_1_1converter.html +++ b/classstdex_1_1stream_1_1converter.html @@ -491,7 +491,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1diag__file-members.html b/classstdex_1_1stream_1_1diag__file-members.html index 47676b5e3..4b48ac05e 100644 --- a/classstdex_1_1stream_1_1diag__file-members.html +++ b/classstdex_1_1stream_1_1diag__file-members.html @@ -168,7 +168,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1diag__file.html b/classstdex_1_1stream_1_1diag__file.html index 9ebb29397..101e71ddd 100644 --- a/classstdex_1_1stream_1_1diag__file.html +++ b/classstdex_1_1stream_1_1diag__file.html @@ -717,7 +717,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1fifo-members.html b/classstdex_1_1stream_1_1fifo-members.html index bd7994932..6d3acc1fb 100644 --- a/classstdex_1_1stream_1_1fifo-members.html +++ b/classstdex_1_1stream_1_1fifo-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1fifo.html b/classstdex_1_1stream_1_1fifo.html index aa6bdfc21..fec010ee4 100644 --- a/classstdex_1_1stream_1_1fifo.html +++ b/classstdex_1_1stream_1_1fifo.html @@ -463,7 +463,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1file-members.html b/classstdex_1_1stream_1_1file-members.html index 2d6c9a987..21a5f887b 100644 --- a/classstdex_1_1stream_1_1file-members.html +++ b/classstdex_1_1stream_1_1file-members.html @@ -190,7 +190,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1file.html b/classstdex_1_1stream_1_1file.html index eee7378af..15bb5176e 100644 --- a/classstdex_1_1stream_1_1file.html +++ b/classstdex_1_1stream_1_1file.html @@ -1115,7 +1115,7 @@ template<class TR = std::char_traits<schar_t>, class AX = std::alloca diff --git a/classstdex_1_1stream_1_1file__window-members.html b/classstdex_1_1stream_1_1file__window-members.html index 98ef43b40..e0bb08d0e 100644 --- a/classstdex_1_1stream_1_1file__window-members.html +++ b/classstdex_1_1stream_1_1file__window-members.html @@ -169,7 +169,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1file__window.html b/classstdex_1_1stream_1_1file__window.html index e92e1c8f5..b642b59a5 100644 --- a/classstdex_1_1stream_1_1file__window.html +++ b/classstdex_1_1stream_1_1file__window.html @@ -749,7 +749,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1limiter-members.html b/classstdex_1_1stream_1_1limiter-members.html index 9f9a69ef0..45984ef80 100644 --- a/classstdex_1_1stream_1_1limiter-members.html +++ b/classstdex_1_1stream_1_1limiter-members.html @@ -154,7 +154,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1limiter.html b/classstdex_1_1stream_1_1limiter.html index 6d2bb2aa4..268b624d2 100644 --- a/classstdex_1_1stream_1_1limiter.html +++ b/classstdex_1_1stream_1_1limiter.html @@ -440,7 +440,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1memory__file-members.html b/classstdex_1_1stream_1_1memory__file-members.html index 43f003886..a7f80a0d6 100644 --- a/classstdex_1_1stream_1_1memory__file-members.html +++ b/classstdex_1_1stream_1_1memory__file-members.html @@ -213,7 +213,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1memory__file.html b/classstdex_1_1stream_1_1memory__file.html index 952fcd454..be4851d3b 100644 --- a/classstdex_1_1stream_1_1memory__file.html +++ b/classstdex_1_1stream_1_1memory__file.html @@ -1719,7 +1719,7 @@ template<class T > diff --git a/classstdex_1_1stream_1_1replicator-members.html b/classstdex_1_1stream_1_1replicator-members.html index 30b251939..4b6535e85 100644 --- a/classstdex_1_1stream_1_1replicator-members.html +++ b/classstdex_1_1stream_1_1replicator-members.html @@ -154,7 +154,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1replicator.html b/classstdex_1_1stream_1_1replicator.html index 4075e3071..68fab00c3 100644 --- a/classstdex_1_1stream_1_1replicator.html +++ b/classstdex_1_1stream_1_1replicator.html @@ -453,7 +453,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1replicator_1_1worker-members.html b/classstdex_1_1stream_1_1replicator_1_1worker-members.html index 7e235427c..b6ddbb8b1 100644 --- a/classstdex_1_1stream_1_1replicator_1_1worker-members.html +++ b/classstdex_1_1stream_1_1replicator_1_1worker-members.html @@ -95,7 +95,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1replicator_1_1worker.html b/classstdex_1_1stream_1_1replicator_1_1worker.html index 2c9635adf..9c1463319 100644 --- a/classstdex_1_1stream_1_1replicator_1_1worker.html +++ b/classstdex_1_1stream_1_1replicator_1_1worker.html @@ -151,7 +151,7 @@ void process_op () diff --git a/classstdex_1_1stream_1_1socket-members.html b/classstdex_1_1stream_1_1socket-members.html index 84bd1d481..11587340f 100644 --- a/classstdex_1_1stream_1_1socket-members.html +++ b/classstdex_1_1stream_1_1socket-members.html @@ -157,7 +157,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1socket.html b/classstdex_1_1stream_1_1socket.html index 24de810d6..a8ce16ef5 100644 --- a/classstdex_1_1stream_1_1socket.html +++ b/classstdex_1_1stream_1_1socket.html @@ -509,7 +509,7 @@ state_t m_state diff --git a/classstdex_1_1stream_1_1window-members.html b/classstdex_1_1stream_1_1window-members.html index ef5a4ce0c..2f072b441 100644 --- a/classstdex_1_1stream_1_1window-members.html +++ b/classstdex_1_1stream_1_1window-members.html @@ -157,7 +157,7 @@ $(function() { diff --git a/classstdex_1_1stream_1_1window.html b/classstdex_1_1stream_1_1window.html index ee1c5ac3c..fea9af485 100644 --- a/classstdex_1_1stream_1_1window.html +++ b/classstdex_1_1stream_1_1window.html @@ -449,7 +449,7 @@ state_t m_state diff --git a/classstdex_1_1stream__hasher-members.html b/classstdex_1_1stream__hasher-members.html index de7619a10..2d6676ead 100644 --- a/classstdex_1_1stream__hasher-members.html +++ b/classstdex_1_1stream__hasher-members.html @@ -153,7 +153,7 @@ $(function() { diff --git a/classstdex_1_1stream__hasher.html b/classstdex_1_1stream__hasher.html index 39bd753c0..9b348d705 100644 --- a/classstdex_1_1stream__hasher.html +++ b/classstdex_1_1stream__hasher.html @@ -432,7 +432,7 @@ template<class T > diff --git a/classstdex_1_1sys__object-members.html b/classstdex_1_1sys__object-members.html index 48e920c58..7c7d62755 100644 --- a/classstdex_1_1sys__object-members.html +++ b/classstdex_1_1sys__object-members.html @@ -97,7 +97,7 @@ $(function() { diff --git a/classstdex_1_1sys__object.html b/classstdex_1_1sys__object.html index ba77a5da9..ba522817b 100644 --- a/classstdex_1_1sys__object.html +++ b/classstdex_1_1sys__object.html @@ -184,7 +184,7 @@ sys_handle m_h diff --git a/classstdex_1_1user__cancelled-members.html b/classstdex_1_1user__cancelled-members.html index ec28e904e..22d2ffe11 100644 --- a/classstdex_1_1user__cancelled-members.html +++ b/classstdex_1_1user__cancelled-members.html @@ -86,7 +86,7 @@ $(function() { diff --git a/classstdex_1_1user__cancelled.html b/classstdex_1_1user__cancelled.html index 1f7e58f01..a740ba1a3 100644 --- a/classstdex_1_1user__cancelled.html +++ b/classstdex_1_1user__cancelled.html @@ -142,7 +142,7 @@ Public Member Functions diff --git a/classstdex_1_1vector__queue-members.html b/classstdex_1_1vector__queue-members.html index 704ef98b8..c271db504 100644 --- a/classstdex_1_1vector__queue-members.html +++ b/classstdex_1_1vector__queue-members.html @@ -124,7 +124,7 @@ $(function() { diff --git a/classstdex_1_1vector__queue.html b/classstdex_1_1vector__queue.html index 8de4a327b..44e447f7e 100644 --- a/classstdex_1_1vector__queue.html +++ b/classstdex_1_1vector__queue.html @@ -782,7 +782,7 @@ template<class T > diff --git a/classstdex_1_1watchdog-members.html b/classstdex_1_1watchdog-members.html index 0e0463b9a..262690252 100644 --- a/classstdex_1_1watchdog-members.html +++ b/classstdex_1_1watchdog-members.html @@ -96,7 +96,7 @@ $(function() { diff --git a/classstdex_1_1watchdog.html b/classstdex_1_1watchdog.html index 3508ac78a..db8205929 100644 --- a/classstdex_1_1watchdog.html +++ b/classstdex_1_1watchdog.html @@ -218,7 +218,7 @@ template<class _Clock , class _Duration = typename _Clock::duration> diff --git a/classstdex_1_1zlib__reader-members.html b/classstdex_1_1zlib__reader-members.html index 323e1296b..919cd6f0d 100644 --- a/classstdex_1_1zlib__reader-members.html +++ b/classstdex_1_1zlib__reader-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1zlib__reader.html b/classstdex_1_1zlib__reader.html index d472b1554..e08aa4fbd 100644 --- a/classstdex_1_1zlib__reader.html +++ b/classstdex_1_1zlib__reader.html @@ -392,7 +392,7 @@ state_t m_state diff --git a/classstdex_1_1zlib__writer-members.html b/classstdex_1_1zlib__writer-members.html index d5c7ee16c..885689013 100644 --- a/classstdex_1_1zlib__writer-members.html +++ b/classstdex_1_1zlib__writer-members.html @@ -156,7 +156,7 @@ $(function() { diff --git a/classstdex_1_1zlib__writer.html b/classstdex_1_1zlib__writer.html index 0d37e91cf..8b441d9a6 100644 --- a/classstdex_1_1zlib__writer.html +++ b/classstdex_1_1zlib__writer.html @@ -392,7 +392,7 @@ state_t m_state diff --git a/debug_8hpp_source.html b/debug_8hpp_source.html index b7347e75d..c58480b2d 100644 --- a/debug_8hpp_source.html +++ b/debug_8hpp_source.html @@ -94,96 +94,126 @@ $(function() { codefold.init(0); });
8#include "compat.hpp"
9#include "string.hpp"
10#include <stdarg.h>
-
11#include <stdio.h>
-
12
-
13namespace stdex
-
14{
-
15 namespace diag {
-
17 inline void vprintf(_In_z_ _Printf_format_string_ const char* format, _In_ va_list arg)
-
18 {
-
19#if defined(NDEBUG)
-
20 UNREFERENCED_PARAMETER(format);
-
21 UNREFERENCED_PARAMETER(arg);
-
22#elif defined(_WIN32)
-
23 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
-
24 OutputDebugStringA(tmp.c_str());
-
25#else
-
26 vfprintf(stdout, format, arg);
-
27#endif
-
28 }
-
29
-
30 inline void vprintf(_In_z_ _Printf_format_string_ const wchar_t* format, _In_ va_list arg)
-
31 {
-
32#if defined(NDEBUG)
-
33 UNREFERENCED_PARAMETER(format);
-
34 UNREFERENCED_PARAMETER(arg);
-
35#elif defined(_WIN32)
-
36 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
-
37 OutputDebugStringW(tmp.c_str());
-
38#else
-
39 vfwprintf(stdout, format, arg);
-
40#endif
-
41 }
-
43
-
53 template <class T>
-
54 inline void printf(_In_z_ _Printf_format_string_ const T* format, ...)
-
55 {
-
56#if defined(NDEBUG)
-
57 UNREFERENCED_PARAMETER(format);
-
58#else
-
59 va_list arg;
-
60 va_start(arg, format);
-
61 vprintf(format, arg);
-
62 va_end(arg);
-
63#endif
-
64 }
-
65 }
-
66
-
67 namespace err {
-
69 inline void vprintf(_In_z_ _Printf_format_string_ const char* format, _In_ va_list arg)
-
70 {
-
71#if defined(NDEBUG)
-
72 UNREFERENCED_PARAMETER(format);
-
73 UNREFERENCED_PARAMETER(arg);
-
74#elif defined(_WIN32)
-
75 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
-
76 OutputDebugStringA(tmp.c_str());
-
77#else
-
78 vfprintf(stderr, format, arg);
-
79#endif
-
80 }
-
81
-
82 inline void vprintf(_In_z_ _Printf_format_string_ const wchar_t* format, _In_ va_list arg)
-
83 {
-
84#if defined(NDEBUG)
-
85 UNREFERENCED_PARAMETER(format);
-
86 UNREFERENCED_PARAMETER(arg);
-
87#elif defined(_WIN32)
-
88 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
-
89 OutputDebugStringW(tmp.c_str());
-
90#else
-
91 vfwprintf(stderr, format, arg);
-
92#endif
-
93 }
-
95
-
105 template <class T>
-
106 inline void printf(_In_z_ _Printf_format_string_ const T* format, ...)
-
107 {
-
108#if defined(NDEBUG)
-
109 UNREFERENCED_PARAMETER(format);
-
110#else
-
111 va_list arg;
-
112 va_start(arg, format);
-
113 vprintf(format, arg);
-
114 va_end(arg);
-
115#endif
-
116 }
-
117 }
-
118}
+
11#include <stdint.h>
+
12#include <stdio.h>
+
13#include <chrono>
+
14
+
15namespace stdex
+
16{
+
17 namespace diag {
+
19 inline void vprintf(_In_z_ _Printf_format_string_ const char* format, _In_ va_list arg)
+
20 {
+
21#if defined(NDEBUG)
+
22 UNREFERENCED_PARAMETER(format);
+
23 UNREFERENCED_PARAMETER(arg);
+
24#elif defined(_WIN32)
+
25 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
+
26 OutputDebugStringA(tmp.c_str());
+
27#else
+
28 vfprintf(stdout, format, arg);
+
29#endif
+
30 }
+
31
+
32 inline void vprintf(_In_z_ _Printf_format_string_ const wchar_t* format, _In_ va_list arg)
+
33 {
+
34#if defined(NDEBUG)
+
35 UNREFERENCED_PARAMETER(format);
+
36 UNREFERENCED_PARAMETER(arg);
+
37#elif defined(_WIN32)
+
38 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
+
39 OutputDebugStringW(tmp.c_str());
+
40#else
+
41 vfwprintf(stdout, format, arg);
+
42#endif
+
43 }
+
45
+
55 template <class T>
+
56 inline void printf(_In_z_ _Printf_format_string_ const T* format, ...)
+
57 {
+
58#if defined(NDEBUG)
+
59 UNREFERENCED_PARAMETER(format);
+
60#else
+
61 va_list arg;
+
62 va_start(arg, format);
+
63 vprintf(format, arg);
+
64 va_end(arg);
+
65#endif
+
66 }
+
67 }
+
68
+
69 namespace err {
+
71 inline void vprintf(_In_z_ _Printf_format_string_ const char* format, _In_ va_list arg)
+
72 {
+
73#if defined(NDEBUG)
+
74 UNREFERENCED_PARAMETER(format);
+
75 UNREFERENCED_PARAMETER(arg);
+
76#elif defined(_WIN32)
+
77 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
+
78 OutputDebugStringA(tmp.c_str());
+
79#else
+
80 vfprintf(stderr, format, arg);
+
81#endif
+
82 }
+
83
+
84 inline void vprintf(_In_z_ _Printf_format_string_ const wchar_t* format, _In_ va_list arg)
+
85 {
+
86#if defined(NDEBUG)
+
87 UNREFERENCED_PARAMETER(format);
+
88 UNREFERENCED_PARAMETER(arg);
+
89#elif defined(_WIN32)
+
90 auto tmp = stdex::vsprintf(format, stdex::locale_default, arg);
+
91 OutputDebugStringW(tmp.c_str());
+
92#else
+
93 vfwprintf(stderr, format, arg);
+
94#endif
+
95 }
+
97
+
107 template <class T>
+
108 inline void printf(_In_z_ _Printf_format_string_ const T* format, ...)
+
109 {
+
110#if defined(NDEBUG)
+
111 UNREFERENCED_PARAMETER(format);
+
112#else
+
113 va_list arg;
+
114 va_start(arg, format);
+
115 vprintf(format, arg);
+
116 va_end(arg);
+
117#endif
+
118 }
+
119 }
+
120
+
+
124 class benchmark
+
125 {
+
126 public:
+
+
132 benchmark(_In_z_ const char* task_name) :
+
133 m_task_name(task_name),
+
134 m_start(std::chrono::high_resolution_clock::now())
+
135 {}
+
+
136
+
+ +
141 {
+
142 auto duration(std::chrono::high_resolution_clock::now() - m_start);
+
143 stdex::diag::printf("%s took %I64i ns\n", m_task_name, static_cast<int64_t>(duration.count()));
+
144 }
+
+
145
+
146 protected:
+
147 const char* m_task_name;
+
148 std::chrono::time_point<std::chrono::high_resolution_clock> m_start;
+
149 };
+
+
150}
+
stdex::benchmark
Measures time between initialization and going out of scope.
Definition debug.hpp:125
+
stdex::benchmark::benchmark
benchmark(const char *task_name)
Starts the measurement.
Definition debug.hpp:132
+
stdex::benchmark::~benchmark
~benchmark()
Stops the measurement and outputs the result to the diagnostic console.
Definition debug.hpp:140
diff --git a/dir_4be4f7b278e009bf0f1906cf31fb73bd.html b/dir_4be4f7b278e009bf0f1906cf31fb73bd.html index a8c45bffb..db2295b14 100644 --- a/dir_4be4f7b278e009bf0f1906cf31fb73bd.html +++ b/dir_4be4f7b278e009bf0f1906cf31fb73bd.html @@ -106,7 +106,7 @@ Files diff --git a/dir_d44c64559bbebec7f509842c48db8b23.html b/dir_d44c64559bbebec7f509842c48db8b23.html index 1c9b783eb..884ac6610 100644 --- a/dir_d44c64559bbebec7f509842c48db8b23.html +++ b/dir_d44c64559bbebec7f509842c48db8b23.html @@ -88,7 +88,7 @@ Directories diff --git a/dir_fca3c47b2ea228727bd6729832f89576.html b/dir_fca3c47b2ea228727bd6729832f89576.html index e88541f1b..0c90fe7b4 100644 --- a/dir_fca3c47b2ea228727bd6729832f89576.html +++ b/dir_fca3c47b2ea228727bd6729832f89576.html @@ -154,7 +154,7 @@ Files diff --git a/doxygen_crawl.html b/doxygen_crawl.html index a0f4e7f22..70f7e5574 100644 --- a/doxygen_crawl.html +++ b/doxygen_crawl.html @@ -52,6 +52,10 @@ + + + + @@ -62,6 +66,8 @@ + + diff --git a/endian_8hpp_source.html b/endian_8hpp_source.html index 697addec7..c99d13a5d 100644 --- a/endian_8hpp_source.html +++ b/endian_8hpp_source.html @@ -227,7 +227,7 @@ $(function() { codefold.init(0); }); diff --git a/exception_8hpp_source.html b/exception_8hpp_source.html index 97c4dc66e..83eb7a038 100644 --- a/exception_8hpp_source.html +++ b/exception_8hpp_source.html @@ -109,7 +109,7 @@ $(function() { codefold.init(0); }); diff --git a/files.html b/files.html index 99a04119f..a645fddee 100644 --- a/files.html +++ b/files.html @@ -129,7 +129,7 @@ $(function() { diff --git a/functions.html b/functions.html index da5cf3543..d907998cd 100644 --- a/functions.html +++ b/functions.html @@ -80,6 +80,7 @@ $(function() {
  • active_tokens : stdex::html::inserted_token
  • admin : stdex::sys_info_t
  • after_word : stdex::html::inserted_token
  • +
  • aggregate_progress() : stdex::aggregate_progress< T >
  • allow_on_edge : stdex::parser::basic_dns_domain_char< T >
  • apex : stdex::parser::basic_emoticon< T >
  • append() : stdex::html::document< T, TR, AX >
  • @@ -90,13 +91,13 @@ $(function() {
  • at() : stdex::vector_queue< T >
  • at_abs() : stdex::vector_queue< T >
  • atime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • -
  • attach() : stdex::global_progress< T >
  • +
  • attach() : stdex::aggregate_progress< T >, stdex::global_progress< T >
  • attributes : stdex::html::declaration, stdex::html::element, stdex::parser::basic_html_tag< T >
  • diff --git a/functions_b.html b/functions_b.html index 7e6c0fbd1..6c69bb89b 100644 --- a/functions_b.html +++ b/functions_b.html @@ -80,6 +80,7 @@ $(function() {
  • base64_enc() : stdex::base64_enc
  • base_type : stdex::parser::basic_mime_type< T >
  • bban : stdex::parser::basic_iban< T >
  • +
  • benchmark() : stdex::benchmark
  • bits_per_channel : stdex::wav::format
  • block_align : stdex::wav::format
  • block_offset : stdex::wav::cue
  • @@ -90,7 +91,7 @@ $(function() { diff --git a/functions_c.html b/functions_c.html index 115ec2ae2..4d1e48948 100644 --- a/functions_c.html +++ b/functions_c.html @@ -76,13 +76,13 @@ $(function() {

    - c -

    diff --git a/functions_func_c.html b/functions_func_c.html index 64b3f6dc6..4c59b72a3 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -76,9 +76,9 @@ $(function() {

    - c -

    diff --git a/functions_func_p.html b/functions_func_p.html index 91cf0a902..b94bc5b30 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_func_q.html b/functions_func_q.html index a88dcd0ae..507a2fd40 100644 --- a/functions_func_q.html +++ b/functions_func_q.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_func_r.html b/functions_func_r.html index 5ad496ae3..15f488677 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -94,7 +94,7 @@ $(function() { diff --git a/functions_func_s.html b/functions_func_s.html index d70758264..b39b648a4 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -80,15 +80,15 @@ $(function() {
  • seekbeg() : stdex::stream::basic_file
  • seekcur() : stdex::stream::basic_file
  • seekend() : stdex::stream::basic_file
  • -
  • set() : stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >, stdex::stream::memory_file
  • +
  • set() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >, stdex::stream::memory_file
  • set_atime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • set_ctime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • set_global_range() : stdex::global_progress< T >
  • set_mtime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • -
  • set_range() : stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >
  • +
  • set_range() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >
  • set_section_range() : stdex::global_progress< T >
  • -
  • set_text() : stdex::global_progress< T >, stdex::progress< T >
  • -
  • show() : stdex::global_progress< T >, stdex::progress< T >
  • +
  • set_text() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::progress< T >
  • +
  • show() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::progress< T >
  • size() : stdex::basic_hash< T >, stdex::interval< T >, stdex::stream::basic_file, stdex::stream::cache, stdex::stream::diag_file, stdex::stream::fifo, stdex::stream::file, stdex::stream::file_window, stdex::stream::memory_file, stdex::vector_queue< T >
  • skip() : stdex::stream::basic, stdex::stream::basic_file, stdex::stream::file_window
  • socket() : stdex::stream::socket
  • @@ -103,7 +103,7 @@ $(function() { diff --git a/functions_func_t.html b/functions_func_t.html index 1bc069dbe..173795a95 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_func_u.html b/functions_func_u.html index 2874b6e99..71b549b09 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_func_v.html b/functions_func_v.html index ca486c9b3..d7fb028d2 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_func_w.html b/functions_func_w.html index b31d58997..9e37489f1 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_func_~.html b/functions_func_~.html index 1c441d749..9eaa3d74a 100644 --- a/functions_func_~.html +++ b/functions_func_~.html @@ -75,13 +75,14 @@ $(function() {
    Here is a list of all documented functions with links to the class documentation for each member:

    - ~ -

    diff --git a/functions_g.html b/functions_g.html index 8f29599e8..08d6cb356 100644 --- a/functions_g.html +++ b/functions_g.html @@ -76,12 +76,12 @@ $(function() {

    - g -

    diff --git a/functions_h.html b/functions_h.html index e7f030821..510916ab8 100644 --- a/functions_h.html +++ b/functions_h.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_i.html b/functions_i.html index d886cfe1f..50f9e52c2 100644 --- a/functions_i.html +++ b/functions_i.html @@ -103,7 +103,7 @@ $(function() { diff --git a/functions_l.html b/functions_l.html index 643f567c1..4a91a6497 100644 --- a/functions_l.html +++ b/functions_l.html @@ -85,7 +85,7 @@ $(function() { diff --git a/functions_m.html b/functions_m.html index 0a9a51c13..2ba8d02d8 100644 --- a/functions_m.html +++ b/functions_m.html @@ -126,7 +126,7 @@ $(function() { diff --git a/functions_n.html b/functions_n.html index ca5cd5f98..ea5aa446d 100644 --- a/functions_n.html +++ b/functions_n.html @@ -90,7 +90,7 @@ $(function() { diff --git a/functions_o.html b/functions_o.html index 293a2967f..777ad2293 100644 --- a/functions_o.html +++ b/functions_o.html @@ -87,16 +87,16 @@ $(function() {
  • operator-() : stdex::interval< T >
  • operator--() : stdex::interval< T >
  • operator<< : stdex::idrec::record< T, T_id, ID, T_size, N_align >
  • -
  • operator=() : stdex::idrec::record< T, T_id, ID, T_size, N_align >, stdex::stream::memory_file, stdex::vector_queue< T >
  • +
  • operator=() : stdex::idrec::record< T, T_id, ID, T_size, N_align >, stdex::stream::memory_file, stdex::vector_queue< T >
  • operator==() : stdex::interval< T >, stdex::mapping< T >
  • operator>> : stdex::idrec::record< T, T_id, ID, T_size, N_align >
  • -
  • operator[]() : stdex::vector_queue< T >
  • +
  • operator[]() : stdex::aggregate_progress< T >, stdex::vector_queue< T >
  • os_platform : stdex::sys_info_t
  • diff --git a/functions_p.html b/functions_p.html index e00979e5a..0ce74facf 100644 --- a/functions_p.html +++ b/functions_p.html @@ -97,7 +97,7 @@ $(function() { diff --git a/functions_q.html b/functions_q.html index 79d7cee88..3791a4cb9 100644 --- a/functions_q.html +++ b/functions_q.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_r.html b/functions_r.html index 385baa61f..ae778d98f 100644 --- a/functions_r.html +++ b/functions_r.html @@ -97,7 +97,7 @@ $(function() { diff --git a/functions_rela.html b/functions_rela.html index 7960033c9..061a4dd11 100644 --- a/functions_rela.html +++ b/functions_rela.html @@ -79,7 +79,7 @@ $(function() { diff --git a/functions_s.html b/functions_s.html index 5547f3409..7aa5bf1f7 100644 --- a/functions_s.html +++ b/functions_s.html @@ -84,15 +84,15 @@ $(function() {
  • seekend() : stdex::stream::basic_file
  • segments : stdex::parser::http_url_path
  • sequence : stdex::html::token
  • -
  • set() : stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >, stdex::stream::memory_file
  • +
  • set() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >, stdex::stream::memory_file
  • set_atime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • set_ctime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • set_global_range() : stdex::global_progress< T >
  • set_mtime() : stdex::stream::basic_file, stdex::stream::cache, stdex::stream::file
  • -
  • set_range() : stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >
  • +
  • set_range() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::lazy_progress< T >, stdex::progress< T >
  • set_section_range() : stdex::global_progress< T >
  • -
  • set_text() : stdex::global_progress< T >, stdex::progress< T >
  • -
  • show() : stdex::global_progress< T >, stdex::progress< T >
  • +
  • set_text() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::progress< T >
  • +
  • show() : stdex::aggregate_progress< T >::worker_progress, stdex::global_progress< T >, stdex::progress< T >
  • size() : stdex::basic_hash< T >, stdex::interval< T >, stdex::stream::basic_file, stdex::stream::cache, stdex::stream::diag_file, stdex::stream::fifo, stdex::stream::file, stdex::stream::file_window, stdex::stream::memory_file, stdex::vector_queue< T >
  • size_type : stdex::vector_queue< T >
  • skip() : stdex::stream::basic, stdex::stream::basic_file, stdex::stream::file_window
  • @@ -112,7 +112,7 @@ $(function() { diff --git a/functions_t.html b/functions_t.html index a34b56848..15bc9078b 100644 --- a/functions_t.html +++ b/functions_t.html @@ -92,7 +92,7 @@ $(function() { diff --git a/functions_type.html b/functions_type.html index a530d4380..aae0f8a45 100644 --- a/functions_type.html +++ b/functions_type.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_u.html b/functions_u.html index e8ec3ad82..10830159d 100644 --- a/functions_u.html +++ b/functions_u.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_v.html b/functions_v.html index 59812bfd5..6ac835f0c 100644 --- a/functions_v.html +++ b/functions_v.html @@ -83,7 +83,7 @@ $(function() { diff --git a/functions_vars.html b/functions_vars.html index 6bb2e31ed..4da80460e 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -85,7 +85,7 @@ $(function() { diff --git a/functions_vars_b.html b/functions_vars_b.html index fd2c255cf..727a7b0fe 100644 --- a/functions_vars_b.html +++ b/functions_vars_b.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_vars_c.html b/functions_vars_c.html index b8d0940b7..01923f0c8 100644 --- a/functions_vars_c.html +++ b/functions_vars_c.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_vars_d.html b/functions_vars_d.html index 8c90b5f73..41f99ea61 100644 --- a/functions_vars_d.html +++ b/functions_vars_d.html @@ -86,7 +86,7 @@ $(function() { diff --git a/functions_vars_e.html b/functions_vars_e.html index 0a692afb3..bfbcd0f59 100644 --- a/functions_vars_e.html +++ b/functions_vars_e.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_vars_f.html b/functions_vars_f.html index efb4b68c3..4199bfb80 100644 --- a/functions_vars_f.html +++ b/functions_vars_f.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_h.html b/functions_vars_h.html index 96a568695..646aedf21 100644 --- a/functions_vars_h.html +++ b/functions_vars_h.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_i.html b/functions_vars_i.html index dbc8717c4..e18b0448f 100644 --- a/functions_vars_i.html +++ b/functions_vars_i.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_vars_l.html b/functions_vars_l.html index df09d79c1..c1f4ede9d 100644 --- a/functions_vars_l.html +++ b/functions_vars_l.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_m.html b/functions_vars_m.html index 71988a7af..aaaebe68b 100644 --- a/functions_vars_m.html +++ b/functions_vars_m.html @@ -121,7 +121,7 @@ $(function() { diff --git a/functions_vars_n.html b/functions_vars_n.html index 45aa84c66..dbc1e3c53 100644 --- a/functions_vars_n.html +++ b/functions_vars_n.html @@ -89,7 +89,7 @@ $(function() { diff --git a/functions_vars_o.html b/functions_vars_o.html index 93bd59cf0..aa6d19054 100644 --- a/functions_vars_o.html +++ b/functions_vars_o.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_p.html b/functions_vars_p.html index 5b296461d..9e47b067d 100644 --- a/functions_vars_p.html +++ b/functions_vars_p.html @@ -88,7 +88,7 @@ $(function() { diff --git a/functions_vars_r.html b/functions_vars_r.html index 96d8deb52..80e92b6db 100644 --- a/functions_vars_r.html +++ b/functions_vars_r.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_vars_s.html b/functions_vars_s.html index a8b13675e..b5eb70c63 100644 --- a/functions_vars_s.html +++ b/functions_vars_s.html @@ -87,7 +87,7 @@ $(function() { diff --git a/functions_vars_t.html b/functions_vars_t.html index 1a1a2b7b2..8317e5dbb 100644 --- a/functions_vars_t.html +++ b/functions_vars_t.html @@ -84,7 +84,7 @@ $(function() { diff --git a/functions_vars_u.html b/functions_vars_u.html index 6a31aa287..075879e9f 100644 --- a/functions_vars_u.html +++ b/functions_vars_u.html @@ -80,7 +80,7 @@ $(function() { diff --git a/functions_vars_v.html b/functions_vars_v.html index c8e9d4f51..a47c90a93 100644 --- a/functions_vars_v.html +++ b/functions_vars_v.html @@ -81,7 +81,7 @@ $(function() { diff --git a/functions_vars_w.html b/functions_vars_w.html index f16b88b62..00949ab30 100644 --- a/functions_vars_w.html +++ b/functions_vars_w.html @@ -82,7 +82,7 @@ $(function() { diff --git a/functions_w.html b/functions_w.html index 2a7edc97c..bfba97932 100644 --- a/functions_w.html +++ b/functions_w.html @@ -92,7 +92,7 @@ $(function() { diff --git a/functions_~.html b/functions_~.html index 4c7a3005e..385922521 100644 --- a/functions_~.html +++ b/functions_~.html @@ -75,13 +75,14 @@ $(function() {
    Here is a list of all documented class members with links to the class documentation for each member:

    - ~ -

    diff --git a/hash_8cpp_source.html b/hash_8cpp_source.html index 113a4c0cd..f6f6a4d6a 100644 --- a/hash_8cpp_source.html +++ b/hash_8cpp_source.html @@ -166,7 +166,7 @@ $(function() { codefold.init(0); }); diff --git a/hash_8hpp_source.html b/hash_8hpp_source.html index 87baddce8..225b98a9d 100644 --- a/hash_8hpp_source.html +++ b/hash_8hpp_source.html @@ -745,7 +745,7 @@ $(function() { codefold.init(0); }); diff --git a/hex_8hpp_source.html b/hex_8hpp_source.html index 0a6e78590..bc9123ab3 100644 --- a/hex_8hpp_source.html +++ b/hex_8hpp_source.html @@ -223,7 +223,7 @@ $(function() { codefold.init(0); }); diff --git a/hierarchy.html b/hierarchy.html index bcb11def6..b262b8f8c 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -77,237 +77,240 @@ $(function() {
    This inheritance list is sorted roughly, but not completely, alphabetically:
    [detail level 1234]
    - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     Cstdex::chrono::aosn_dateAOsn date
     Cstdex::chrono::aosn_timestampAOsn timestamp
     Cstdex::base64_decBase64 decoding session
     Cstdex::base64_encBase64 encoding session
     Cstdex::stream::basic
    +
     Cstdex::aggregate_progress< T >Aggregated progress indicator
     Cstdex::chrono::aosn_dateAOsn date
     Cstdex::chrono::aosn_timestampAOsn timestamp
     Cstdex::base64_decBase64 decoding session
     Cstdex::base64_encBase64 encoding session
     Cstdex::stream::basic

    ‍UTF-8 byte-order-mark

     Cstdex::basic_hash< T >Basic hashing operations
     Cstdex::basic_hash< crc32_t >
     Cstdex::basic_hash< md5_t >
     Cstdex::basic_hash< sha1_t >
     Cstdex::parser::basic_parser< T >Base template for all parsers
     Cstdex::parser::basic_parser< char >
     Cstdex::stream::buffer::buffer_t
     Cstdex::charset_encoder< T_from, T_to >Encoding converter context
     Cstdex::wav::cueCue point
     Cstdex::wav::dataEncoded waveform content
     Cstdex::html::document< T, TR, AX >HTML document
     Cstdex::html::document< T, TR, AX >
     Cstdex::html::element_traitsDescribes attributes associated with a HTML element
     Cstdex::html::entity< T, TR, AX >HTML entity
     Cstdex::wav::formatWaveform format
     Cstdex::free_locale_deleteDeleter for unique_ptr using free_locale
     Cstdex::wav::headerFile header
     Cstdex::hex_decHexadecimal decoding session
     Cstdex::hex_encHexadecimal encoding session
     Cstdex::parser::html_attributeTag attribute
     Cstdex::parser::http_factor_more< T >
     Cstdex::html::inserted_tokenInserted HTML token
     Cstdex::interval< T >Numerical interval
     Cstdex::interval< fpos_t >
     Cstdex::interval< size_t >
     Cstdex::wav::labelLabel
     Cstdex::wav::ltxtLabeled text
     Cstdex::mapping< T >Maps index in source string to index in destination string
     Cstdex::md2_tMD2 hash value
     Cstdex::no_delete< T >Noop deleter
     Cstdex::no_delete< T[]>Noop array deleter
     Cstdex::stream::fifo::node_t
     Cstdex::wav::noteNote
     Cstdex::html::parser< T, TR, AX >HTML parser
     Cstdex::pool< T >Per-NUMA pool of items
     Cstdex::progress< T >Progress indicator base class
     Cstdex::progress< size_t >
     Cstdex::idrec::record< T, T_id, ID, T_size, N_align >Helper class for read/write of records to/from memory
     Cstdex::ring< T, N_cap >Ring buffer
     Cstdex::ring< uint8_t, default_async_limit >
     Cstd::runtime_error
     Cstdex::html::sequenceBase class for HTML sequences
     Cstdex::sha256_tSHA256 hash value
     Cstdex::sha_tSHA hash value
     Cstdex::wav::silenceSilence
     Cstdex::spinlockSpin-lock
     Cstdex::sys_info_tSystem information
     Cstdex::sys_objectOperating system object (file, pipe, anything with an OS handle etc.)
     CT
     Cstd::thread
     Cstdex::html::tokenHTML token base class
     Cstd::unique_ptr
     Cstdex::vector_queue< T >Helper class to allow limited size FIFO queues implemented as vector of elements
     Cstdex::watchdog< _Clock, _Duration >Triggers callback if not reset frequently enough
     Cstdex::basic_hash< T >Basic hashing operations
     Cstdex::basic_hash< crc32_t >
     Cstdex::basic_hash< md5_t >
     Cstdex::basic_hash< sha1_t >
     Cstdex::parser::basic_parser< T >Base template for all parsers
     Cstdex::parser::basic_parser< char >
     Cstdex::benchmarkMeasures time between initialization and going out of scope
     Cstdex::stream::buffer::buffer_t
     Cstdex::charset_encoder< T_from, T_to >Encoding converter context
     Cstdex::wav::cueCue point
     Cstdex::wav::dataEncoded waveform content
     Cstdex::html::document< T, TR, AX >HTML document
     Cstdex::html::document< T, TR, AX >
     Cstdex::html::element_traitsDescribes attributes associated with a HTML element
     Cstdex::html::entity< T, TR, AX >HTML entity
     Cstdex::wav::formatWaveform format
     Cstdex::free_locale_deleteDeleter for unique_ptr using free_locale
     Cstdex::wav::headerFile header
     Cstdex::hex_decHexadecimal decoding session
     Cstdex::hex_encHexadecimal encoding session
     Cstdex::parser::html_attributeTag attribute
     Cstdex::parser::http_factor_more< T >
     Cstdex::html::inserted_tokenInserted HTML token
     Cstdex::interval< T >Numerical interval
     Cstdex::interval< fpos_t >
     Cstdex::interval< size_t >
     Cstdex::wav::labelLabel
     Cstdex::wav::ltxtLabeled text
     Cstdex::mapping< T >Maps index in source string to index in destination string
     Cstdex::md2_tMD2 hash value
     Cstdex::no_delete< T >Noop deleter
     Cstdex::no_delete< T[]>Noop array deleter
     Cstdex::stream::fifo::node_t
     Cstdex::wav::noteNote
     Cstdex::html::parser< T, TR, AX >HTML parser
     Cstdex::pool< T >Per-NUMA pool of items
     Cstdex::progress< T >Progress indicator base class
     Cstdex::progress< size_t >
     Cstdex::idrec::record< T, T_id, ID, T_size, N_align >Helper class for read/write of records to/from memory
     Cstdex::ring< T, N_cap >Ring buffer
     Cstdex::ring< uint8_t, default_async_limit >
     Cstd::runtime_error
     Cstdex::html::sequenceBase class for HTML sequences
     Cstdex::sha256_tSHA256 hash value
     Cstdex::sha_tSHA hash value
     Cstdex::wav::silenceSilence
     Cstdex::spinlockSpin-lock
     Cstdex::sys_info_tSystem information
     Cstdex::sys_objectOperating system object (file, pipe, anything with an OS handle etc.)
     CT
     Cstd::thread
     Cstdex::html::tokenHTML token base class
     Cstd::unique_ptr
     Cstdex::vector_queue< T >Helper class to allow limited size FIFO queues implemented as vector of elements
     Cstdex::watchdog< _Clock, _Duration >Triggers callback if not reset frequently enough
    diff --git a/html_8hpp_source.html b/html_8hpp_source.html index 711deb9ca..876dd5537 100644 --- a/html_8hpp_source.html +++ b/html_8hpp_source.html @@ -2508,10 +2508,10 @@ $(function() { codefold.init(0); });
    stdex::html::url_token::url
    std::basic_string< T, TR, AX > url
    URL.
    Definition html.hpp:2141
    stdex::parser::basic_parser::interval
    stdex::interval< size_t > interval
    Region of the last match.
    Definition parser.hpp:115
    stdex::parser::basic_string
    Test for given string.
    Definition parser.hpp:830
    -
    stdex::progress
    Progress indicator base class.
    Definition progress.hpp:19
    -
    stdex::progress::cancel
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:65
    -
    stdex::progress::set
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:47
    -
    stdex::progress::set_range
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:37
    +
    stdex::progress
    Progress indicator base class.
    Definition progress.hpp:22
    +
    stdex::progress::cancel
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:68
    +
    stdex::progress::set
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:50
    +
    stdex::progress::set_range
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:40
    stdex::user_cancelled
    User cancelled exception.
    Definition exception.hpp:17
    stdex::html::element_traits
    Describes attributes associated with a HTML element.
    Definition html.hpp:685
    stdex::html::element_traits::is_group
    static bool is_group(element_t code)
    Does element represent a separate part of text?
    Definition html.hpp:1090
    @@ -2546,12 +2546,12 @@ $(function() { codefold.init(0); });
    stdex::interval::end
    T end
    interval end
    Definition interval.hpp:20
    stdex::interval::start
    T start
    interval start
    Definition interval.hpp:19
    stdex::mapping
    Maps index in source string to index in destination string.
    Definition mapping.hpp:17
    -
    stdex::parser::html_attribute
    Tag attribute.
    Definition parser.hpp:8038
    -
    stdex::parser::html_attribute::value
    stdex::interval< size_t > value
    attribute value position in source
    Definition parser.hpp:8040
    +
    stdex::parser::html_attribute
    Tag attribute.
    Definition parser.hpp:8039
    +
    stdex::parser::html_attribute::value
    stdex::interval< size_t > value
    attribute value position in source
    Definition parser.hpp:8041
    diff --git a/idrec_8hpp_source.html b/idrec_8hpp_source.html index 489e191db..3e386a94c 100644 --- a/idrec_8hpp_source.html +++ b/idrec_8hpp_source.html @@ -480,7 +480,7 @@ $(function() { codefold.init(0); }); diff --git a/include_2stdex_2compat_8hpp_source.html b/include_2stdex_2compat_8hpp_source.html index 9ca24be2f..8c4c7a305 100644 --- a/include_2stdex_2compat_8hpp_source.html +++ b/include_2stdex_2compat_8hpp_source.html @@ -298,7 +298,7 @@ $(function() { codefold.init(0); }); diff --git a/index.html b/index.html index db737f6ec..08308822a 100644 --- a/index.html +++ b/index.html @@ -87,7 +87,7 @@ Requirements diff --git a/interval_8hpp_source.html b/interval_8hpp_source.html index 0879e4956..76bc29cbf 100644 --- a/interval_8hpp_source.html +++ b/interval_8hpp_source.html @@ -233,7 +233,7 @@ $(function() { codefold.init(0); }); diff --git a/locale_8hpp_source.html b/locale_8hpp_source.html index 2d2ee2542..f519f8c21 100644 --- a/locale_8hpp_source.html +++ b/locale_8hpp_source.html @@ -188,7 +188,7 @@ $(function() { codefold.init(0); }); diff --git a/mapping_8hpp_source.html b/mapping_8hpp_source.html index ddb3ff8c3..aee22c6fc 100644 --- a/mapping_8hpp_source.html +++ b/mapping_8hpp_source.html @@ -126,7 +126,7 @@ $(function() { codefold.init(0); }); diff --git a/math_8cpp_source.html b/math_8cpp_source.html index 829c2b854..51d77037c 100644 --- a/math_8cpp_source.html +++ b/math_8cpp_source.html @@ -131,7 +131,7 @@ $(function() { codefold.init(0); }); diff --git a/math_8hpp_source.html b/math_8hpp_source.html index dd69afabf..b1e86a90e 100644 --- a/math_8hpp_source.html +++ b/math_8hpp_source.html @@ -169,7 +169,7 @@ $(function() { codefold.init(0); }); diff --git a/memory_8hpp_source.html b/memory_8hpp_source.html index c0ed7db61..859d50d54 100644 --- a/memory_8hpp_source.html +++ b/memory_8hpp_source.html @@ -131,7 +131,7 @@ $(function() { codefold.init(0); }); diff --git a/parser_8cpp_source.html b/parser_8cpp_source.html index 30ff7a51c..32f7ffc0b 100644 --- a/parser_8cpp_source.html +++ b/parser_8cpp_source.html @@ -589,8 +589,8 @@ $(function() { codefold.init(0); });
    stdex::parser::basic_parser< char >
    stdex::parser::basic_parser::interval
    stdex::interval< size_t > interval
    Region of the last match.
    Definition parser.hpp:115
    stdex::parser::basic_string
    Test for given string.
    Definition parser.hpp:830
    -
    stdex::parser::http_header
    Test for HTTP header.
    Definition parser.hpp:7067
    -
    stdex::parser::http_request
    Test for HTTP request.
    Definition parser.hpp:6935
    +
    stdex::parser::http_header
    Test for HTTP header.
    Definition parser.hpp:7068
    +
    stdex::parser::http_request
    Test for HTTP request.
    Definition parser.hpp:6936
    stdex::parser::sgml_cp
    Test for specific SGML code point.
    Definition parser.hpp:352
    stdex::parser::sgml_space_cp
    Test for any SGML space code point.
    Definition parser.hpp:439
    stdex::interval
    Numerical interval.
    Definition interval.hpp:18
    @@ -600,7 +600,7 @@ $(function() { codefold.init(0); }); diff --git a/parser_8hpp_source.html b/parser_8hpp_source.html index 7555d7500..4f23502d3 100644 --- a/parser_8hpp_source.html +++ b/parser_8hpp_source.html @@ -2503,5902 +2503,5903 @@ $(function() { codefold.init(0); });
    2457 if (i < 4)
    2458 goto error;
    2459
    -
    2460 this->interval.start = start;
    -
    2461 return true;
    -
    2462
    -
    2463 error:
    -
    2464 invalidate();
    -
    2465 return false;
    -
    2466 }
    -
    2467
    -
    2468 std::shared_ptr<basic_parser<T>>
    -
    2469 m_digit_0,
    -
    2470 m_digit_1,
    -
    2471 m_digit_2,
    -
    2472 m_digit_3,
    -
    2473 m_digit_4,
    -
    2474 m_digit_5,
    -
    2475 m_digit_6,
    -
    2476 m_digit_7,
    -
    2477 m_digit_8,
    -
    2478 m_digit_9;
    -
    2479 std::shared_ptr<basic_parser<T>> m_separator;
    -
    2480 };
    +
    2460 value.s_addr = htonl(value.s_addr);
    +
    2461 this->interval.start = start;
    +
    2462 return true;
    +
    2463
    +
    2464 error:
    +
    2465 invalidate();
    +
    2466 return false;
    +
    2467 }
    +
    2468
    +
    2469 std::shared_ptr<basic_parser<T>>
    +
    2470 m_digit_0,
    +
    2471 m_digit_1,
    +
    2472 m_digit_2,
    +
    2473 m_digit_3,
    +
    2474 m_digit_4,
    +
    2475 m_digit_5,
    +
    2476 m_digit_6,
    +
    2477 m_digit_7,
    +
    2478 m_digit_8,
    +
    2479 m_digit_9;
    +
    2480 std::shared_ptr<basic_parser<T>> m_separator;
    +
    2481 };
    -
    2481
    -
    2482 using ipv4_address = basic_ipv4_address<char>;
    -
    2483 using wipv4_address = basic_ipv4_address<wchar_t>;
    -
    2484#ifdef _UNICODE
    -
    2485 using tipv4_address = wipv4_address;
    -
    2486#else
    -
    2487 using tipv4_address = ipv4_address;
    -
    2488#endif
    -
    2489 using sgml_ipv4_address = basic_ipv4_address<char>;
    -
    2490
    -
    2494 template <class T>
    -
    -
    2495 class basic_ipv6_scope_id_char : public basic_parser<T>
    -
    2496 {
    -
    2497 public:
    -
    2498 basic_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    2499
    -
    2500 protected:
    -
    2501 virtual bool do_match(
    -
    2502 _In_reads_or_z_opt_(end) const T* text,
    -
    2503 _In_ size_t start = 0,
    -
    2504 _In_ size_t end = SIZE_MAX,
    -
    2505 _In_ int flags = match_default)
    -
    2506 {
    -
    2507 _Assume_(text || start >= end);
    -
    2508 if (start < end && text[start]) {
    -
    2509 if (text[start] == '-' ||
    -
    2510 text[start] == '_' ||
    -
    2511 text[start] == ':' ||
    -
    2512 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    -
    2513 {
    -
    2514 this->interval.end = (this->interval.start = start) + 1;
    -
    2515 return true;
    -
    2516 }
    -
    2517 }
    -
    2518 this->interval.invalidate();
    -
    2519 return false;
    -
    2520 }
    -
    2521 };
    +
    2482
    +
    2483 using ipv4_address = basic_ipv4_address<char>;
    +
    2484 using wipv4_address = basic_ipv4_address<wchar_t>;
    +
    2485#ifdef _UNICODE
    +
    2486 using tipv4_address = wipv4_address;
    +
    2487#else
    +
    2488 using tipv4_address = ipv4_address;
    +
    2489#endif
    +
    2490 using sgml_ipv4_address = basic_ipv4_address<char>;
    +
    2491
    +
    2495 template <class T>
    +
    + +
    2497 {
    +
    2498 public:
    +
    2499 basic_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    2500
    +
    2501 protected:
    +
    2502 virtual bool do_match(
    +
    2503 _In_reads_or_z_opt_(end) const T* text,
    +
    2504 _In_ size_t start = 0,
    +
    2505 _In_ size_t end = SIZE_MAX,
    +
    2506 _In_ int flags = match_default)
    +
    2507 {
    +
    2508 _Assume_(text || start >= end);
    +
    2509 if (start < end && text[start]) {
    +
    2510 if (text[start] == '-' ||
    +
    2511 text[start] == '_' ||
    +
    2512 text[start] == ':' ||
    +
    2513 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    +
    2514 {
    +
    2515 this->interval.end = (this->interval.start = start) + 1;
    +
    2516 return true;
    +
    2517 }
    +
    2518 }
    +
    2519 this->interval.invalidate();
    +
    2520 return false;
    +
    2521 }
    +
    2522 };
    -
    2522
    -
    2523 using ipv6_scope_id_char = basic_ipv6_scope_id_char<char>;
    -
    2524 using wipv6_scope_id_char = basic_ipv6_scope_id_char<wchar_t>;
    -
    2525#ifdef _UNICODE
    -
    2526 using tipv6_scope_id_char = wipv6_scope_id_char;
    -
    2527#else
    -
    2528 using tipv6_scope_id_char = ipv6_scope_id_char;
    -
    2529#endif
    -
    2530
    -
    - -
    2535 {
    -
    2536 public:
    -
    2537 sgml_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : sgml_parser(locale) {}
    -
    2538
    -
    2539 protected:
    -
    2540 virtual bool do_match(
    -
    2541 _In_reads_or_z_(end) const char* text,
    -
    2542 _In_ size_t start = 0,
    -
    2543 _In_ size_t end = SIZE_MAX,
    -
    2544 _In_ int flags = match_default)
    -
    2545 {
    -
    2546 _Assume_(text || start >= end);
    -
    2547 if (start < end && text[start]) {
    -
    2548 wchar_t buf[3];
    -
    2549 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    -
    2550 const wchar_t* chr_end = chr + stdex::strlen(chr);
    -
    2551 if (((chr[0] == L'-' ||
    -
    2552 chr[0] == L'_' ||
    -
    2553 chr[0] == L':') && chr[1] == 0) ||
    -
    2554 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    -
    2555 {
    -
    2556 this->interval.start = start;
    -
    2557 return true;
    -
    2558 }
    -
    2559 }
    -
    2560 this->interval.invalidate();
    -
    2561 return false;
    -
    2562 }
    -
    2563 };
    +
    2523
    + + +
    2526#ifdef _UNICODE
    + +
    2528#else
    + +
    2530#endif
    +
    2531
    +
    + +
    2536 {
    +
    2537 public:
    +
    2538 sgml_ipv6_scope_id_char(_In_ const std::locale& locale = std::locale()) : sgml_parser(locale) {}
    +
    2539
    +
    2540 protected:
    +
    2541 virtual bool do_match(
    +
    2542 _In_reads_or_z_(end) const char* text,
    +
    2543 _In_ size_t start = 0,
    +
    2544 _In_ size_t end = SIZE_MAX,
    +
    2545 _In_ int flags = match_default)
    +
    2546 {
    +
    2547 _Assume_(text || start >= end);
    +
    2548 if (start < end && text[start]) {
    +
    2549 wchar_t buf[3];
    +
    2550 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    +
    2551 const wchar_t* chr_end = chr + stdex::strlen(chr);
    +
    2552 if (((chr[0] == L'-' ||
    +
    2553 chr[0] == L'_' ||
    +
    2554 chr[0] == L':') && chr[1] == 0) ||
    +
    2555 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    +
    2556 {
    +
    2557 this->interval.start = start;
    +
    2558 return true;
    +
    2559 }
    +
    2560 }
    +
    2561 this->interval.invalidate();
    +
    2562 return false;
    +
    2563 }
    +
    2564 };
    -
    2564
    -
    2568 template <class T>
    -
    - -
    2570 {
    -
    2571 public:
    - -
    2573 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
    -
    2574 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
    -
    2575 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
    -
    2576 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
    -
    2577 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
    -
    2578 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
    -
    2579 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
    -
    2580 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
    -
    2581 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
    -
    2582 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
    -
    2583 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
    -
    2584 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
    -
    2585 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
    -
    2586 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
    -
    2587 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
    -
    2588 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
    -
    2589 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    -
    2590 _In_ const std::shared_ptr<basic_parser<T>>& scope_id_separator = nullptr,
    -
    2591 _In_ const std::shared_ptr<basic_parser<T>>& _scope_id = nullptr,
    -
    2592 _In_ const std::locale& locale = std::locale()) :
    - -
    2594 m_digit_0(digit_0),
    -
    2595 m_digit_1(digit_1),
    -
    2596 m_digit_2(digit_2),
    -
    2597 m_digit_3(digit_3),
    -
    2598 m_digit_4(digit_4),
    -
    2599 m_digit_5(digit_5),
    -
    2600 m_digit_6(digit_6),
    -
    2601 m_digit_7(digit_7),
    -
    2602 m_digit_8(digit_8),
    -
    2603 m_digit_9(digit_9),
    -
    2604 m_digit_10(digit_10),
    -
    2605 m_digit_11(digit_11),
    -
    2606 m_digit_12(digit_12),
    -
    2607 m_digit_13(digit_13),
    -
    2608 m_digit_14(digit_14),
    -
    2609 m_digit_15(digit_15),
    -
    2610 m_separator(separator),
    -
    2611 m_scope_id_separator(scope_id_separator),
    - -
    2613 {
    -
    2614 memset(&value, 0, sizeof(value));
    -
    2615 }
    -
    2616
    -
    2617 virtual void invalidate()
    -
    2618 {
    -
    2619 components[0].start = 1;
    -
    2620 components[0].end = 0;
    -
    2621 components[1].start = 1;
    -
    2622 components[1].end = 0;
    -
    2623 components[2].start = 1;
    -
    2624 components[2].end = 0;
    -
    2625 components[3].start = 1;
    -
    2626 components[3].end = 0;
    -
    2627 components[4].start = 1;
    -
    2628 components[4].end = 0;
    -
    2629 components[5].start = 1;
    -
    2630 components[5].end = 0;
    -
    2631 components[6].start = 1;
    -
    2632 components[6].end = 0;
    -
    2633 components[7].start = 1;
    -
    2634 components[7].end = 0;
    -
    2635 memset(&value, 0, sizeof(value));
    -
    2636 if (scope_id) scope_id->invalidate();
    - -
    2638 }
    -
    2639
    - - -
    2642 std::shared_ptr<basic_parser<T>> scope_id;
    -
    2643
    -
    2644 protected:
    -
    2645 virtual bool do_match(
    -
    2646 _In_reads_or_z_opt_(end) const T* text,
    -
    2647 _In_ size_t start = 0,
    -
    2648 _In_ size_t end = SIZE_MAX,
    -
    2649 _In_ int flags = match_default)
    -
    2650 {
    -
    2651 _Assume_(text || start >= end);
    -
    2652 this->interval.end = start;
    -
    2653 memset(&value, 0, sizeof(value));
    -
    2654
    -
    2655 size_t i, compaction_i = SIZE_MAX, compaction_start = start;
    -
    2656 for (i = 0; i < 8; i++) {
    -
    2657 bool is_empty = true;
    -
    2658
    -
    2659 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    2660 // : found
    -
    2661 this->interval.end = m_separator->interval.end;
    -
    2662 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    2663 // :: found
    -
    2664 if (compaction_i == SIZE_MAX) {
    -
    2665 // Zero compaction start
    -
    2666 compaction_i = i;
    -
    2667 compaction_start = m_separator->interval.start;
    -
    2668 this->interval.end = m_separator->interval.end;
    -
    2669 }
    -
    2670 else {
    -
    2671 // More than one zero compaction
    -
    2672 break;
    -
    2673 }
    -
    2674 }
    -
    2675 else if (!i) {
    -
    2676 // Leading : found
    -
    2677 goto error;
    -
    2678 }
    -
    2679 }
    -
    2680 else if (i) {
    -
    2681 // : missing
    -
    2682 break;
    -
    2683 }
    -
    2684
    -
    2685 components[i].start = this->interval.end;
    -
    2686 size_t x;
    -
    2687 for (x = 0; this->interval.end < end && text[this->interval.end];) {
    -
    2688 size_t dig, digit_end;
    -
    2689 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
    -
    2690 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
    -
    2691 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
    -
    2692 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
    -
    2693 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
    -
    2694 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
    -
    2695 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
    -
    2696 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
    -
    2697 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
    -
    2698 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
    -
    2699 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; digit_end = m_digit_10->interval.end; }
    -
    2700 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; digit_end = m_digit_11->interval.end; }
    -
    2701 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; digit_end = m_digit_12->interval.end; }
    -
    2702 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; digit_end = m_digit_13->interval.end; }
    -
    2703 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; digit_end = m_digit_14->interval.end; }
    -
    2704 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; digit_end = m_digit_15->interval.end; }
    -
    2705 else break;
    -
    2706 size_t x_n = x * 16 + dig;
    -
    2707 if (x_n <= 0xffff) {
    -
    2708 x = x_n;
    -
    2709 this->interval.end = digit_end;
    -
    2710 is_empty = false;
    -
    2711 }
    -
    2712 else
    -
    2713 break;
    -
    2714 }
    -
    2715 if (is_empty) {
    -
    2716 if (compaction_i != SIZE_MAX) {
    -
    2717 // Zero compaction active: no sweat.
    -
    2718 break;
    -
    2719 }
    -
    2720 goto error;
    -
    2721 }
    -
    2722 components[i].end = this->interval.end;
    -
    2723 this->value.s6_words[i] = (uint16_t)x;
    -
    2724 }
    -
    2725
    -
    2726 if (compaction_i != SIZE_MAX) {
    -
    2727 // Align components right due to zero compaction.
    -
    2728 size_t j, k;
    -
    2729 for (j = 8, k = i; k > compaction_i;) {
    -
    2730 this->value.s6_words[--j] = this->value.s6_words[--k];
    - -
    2732 }
    -
    2733 for (; j > compaction_i;) {
    -
    2734 this->value.s6_words[--j] = 0;
    -
    2735 components[j].start =
    - -
    2737 }
    -
    2738 }
    -
    2739 else if (i < 8)
    -
    2740 goto error;
    -
    2741
    -
    2742 if (m_scope_id_separator && m_scope_id_separator->match(text, this->interval.end, end, flags) &&
    -
    2743 scope_id && scope_id->match(text, m_scope_id_separator->interval.end, end, flags))
    -
    2744 this->interval.end = scope_id->interval.end;
    -
    2745 else if (scope_id)
    -
    2746 scope_id->invalidate();
    -
    2747
    -
    2748 this->interval.start = start;
    -
    2749 return true;
    -
    2750
    -
    2751 error:
    -
    2752 invalidate();
    -
    2753 return false;
    -
    2754 }
    -
    2755
    -
    2756 std::shared_ptr<basic_parser<T>>
    -
    2757 m_digit_0,
    -
    2758 m_digit_1,
    -
    2759 m_digit_2,
    -
    2760 m_digit_3,
    -
    2761 m_digit_4,
    -
    2762 m_digit_5,
    -
    2763 m_digit_6,
    -
    2764 m_digit_7,
    -
    2765 m_digit_8,
    -
    2766 m_digit_9,
    -
    2767 m_digit_10,
    -
    2768 m_digit_11,
    -
    2769 m_digit_12,
    -
    2770 m_digit_13,
    -
    2771 m_digit_14,
    -
    2772 m_digit_15;
    -
    2773 std::shared_ptr<basic_parser<T>> m_separator, m_scope_id_separator;
    -
    2774 };
    +
    2565
    +
    2569 template <class T>
    +
    + +
    2571 {
    +
    2572 public:
    + +
    2574 _In_ const std::shared_ptr<basic_parser<T>>& digit_0,
    +
    2575 _In_ const std::shared_ptr<basic_parser<T>>& digit_1,
    +
    2576 _In_ const std::shared_ptr<basic_parser<T>>& digit_2,
    +
    2577 _In_ const std::shared_ptr<basic_parser<T>>& digit_3,
    +
    2578 _In_ const std::shared_ptr<basic_parser<T>>& digit_4,
    +
    2579 _In_ const std::shared_ptr<basic_parser<T>>& digit_5,
    +
    2580 _In_ const std::shared_ptr<basic_parser<T>>& digit_6,
    +
    2581 _In_ const std::shared_ptr<basic_parser<T>>& digit_7,
    +
    2582 _In_ const std::shared_ptr<basic_parser<T>>& digit_8,
    +
    2583 _In_ const std::shared_ptr<basic_parser<T>>& digit_9,
    +
    2584 _In_ const std::shared_ptr<basic_parser<T>>& digit_10,
    +
    2585 _In_ const std::shared_ptr<basic_parser<T>>& digit_11,
    +
    2586 _In_ const std::shared_ptr<basic_parser<T>>& digit_12,
    +
    2587 _In_ const std::shared_ptr<basic_parser<T>>& digit_13,
    +
    2588 _In_ const std::shared_ptr<basic_parser<T>>& digit_14,
    +
    2589 _In_ const std::shared_ptr<basic_parser<T>>& digit_15,
    +
    2590 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    +
    2591 _In_ const std::shared_ptr<basic_parser<T>>& scope_id_separator = nullptr,
    +
    2592 _In_ const std::shared_ptr<basic_parser<T>>& _scope_id = nullptr,
    +
    2593 _In_ const std::locale& locale = std::locale()) :
    + +
    2595 m_digit_0(digit_0),
    +
    2596 m_digit_1(digit_1),
    +
    2597 m_digit_2(digit_2),
    +
    2598 m_digit_3(digit_3),
    +
    2599 m_digit_4(digit_4),
    +
    2600 m_digit_5(digit_5),
    +
    2601 m_digit_6(digit_6),
    +
    2602 m_digit_7(digit_7),
    +
    2603 m_digit_8(digit_8),
    +
    2604 m_digit_9(digit_9),
    +
    2605 m_digit_10(digit_10),
    +
    2606 m_digit_11(digit_11),
    +
    2607 m_digit_12(digit_12),
    +
    2608 m_digit_13(digit_13),
    +
    2609 m_digit_14(digit_14),
    +
    2610 m_digit_15(digit_15),
    +
    2611 m_separator(separator),
    +
    2612 m_scope_id_separator(scope_id_separator),
    + +
    2614 {
    +
    2615 memset(&value, 0, sizeof(value));
    +
    2616 }
    +
    2617
    +
    2618 virtual void invalidate()
    +
    2619 {
    +
    2620 components[0].start = 1;
    +
    2621 components[0].end = 0;
    +
    2622 components[1].start = 1;
    +
    2623 components[1].end = 0;
    +
    2624 components[2].start = 1;
    +
    2625 components[2].end = 0;
    +
    2626 components[3].start = 1;
    +
    2627 components[3].end = 0;
    +
    2628 components[4].start = 1;
    +
    2629 components[4].end = 0;
    +
    2630 components[5].start = 1;
    +
    2631 components[5].end = 0;
    +
    2632 components[6].start = 1;
    +
    2633 components[6].end = 0;
    +
    2634 components[7].start = 1;
    +
    2635 components[7].end = 0;
    +
    2636 memset(&value, 0, sizeof(value));
    +
    2637 if (scope_id) scope_id->invalidate();
    + +
    2639 }
    +
    2640
    + + +
    2643 std::shared_ptr<basic_parser<T>> scope_id;
    +
    2644
    +
    2645 protected:
    +
    2646 virtual bool do_match(
    +
    2647 _In_reads_or_z_opt_(end) const T* text,
    +
    2648 _In_ size_t start = 0,
    +
    2649 _In_ size_t end = SIZE_MAX,
    +
    2650 _In_ int flags = match_default)
    +
    2651 {
    +
    2652 _Assume_(text || start >= end);
    +
    2653 this->interval.end = start;
    +
    2654 memset(&value, 0, sizeof(value));
    +
    2655
    +
    2656 size_t i, compaction_i = SIZE_MAX, compaction_start = start;
    +
    2657 for (i = 0; i < 8; i++) {
    +
    2658 bool is_empty = true;
    +
    2659
    +
    2660 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    2661 // : found
    +
    2662 this->interval.end = m_separator->interval.end;
    +
    2663 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    2664 // :: found
    +
    2665 if (compaction_i == SIZE_MAX) {
    +
    2666 // Zero compaction start
    +
    2667 compaction_i = i;
    +
    2668 compaction_start = m_separator->interval.start;
    +
    2669 this->interval.end = m_separator->interval.end;
    +
    2670 }
    +
    2671 else {
    +
    2672 // More than one zero compaction
    +
    2673 break;
    +
    2674 }
    +
    2675 }
    +
    2676 else if (!i) {
    +
    2677 // Leading : found
    +
    2678 goto error;
    +
    2679 }
    +
    2680 }
    +
    2681 else if (i) {
    +
    2682 // : missing
    +
    2683 break;
    +
    2684 }
    +
    2685
    +
    2686 components[i].start = this->interval.end;
    +
    2687 size_t x;
    +
    2688 for (x = 0; this->interval.end < end && text[this->interval.end];) {
    +
    2689 size_t dig, digit_end;
    +
    2690 if (m_digit_0->match(text, this->interval.end, end, flags)) { dig = 0; digit_end = m_digit_0->interval.end; }
    +
    2691 else if (m_digit_1->match(text, this->interval.end, end, flags)) { dig = 1; digit_end = m_digit_1->interval.end; }
    +
    2692 else if (m_digit_2->match(text, this->interval.end, end, flags)) { dig = 2; digit_end = m_digit_2->interval.end; }
    +
    2693 else if (m_digit_3->match(text, this->interval.end, end, flags)) { dig = 3; digit_end = m_digit_3->interval.end; }
    +
    2694 else if (m_digit_4->match(text, this->interval.end, end, flags)) { dig = 4; digit_end = m_digit_4->interval.end; }
    +
    2695 else if (m_digit_5->match(text, this->interval.end, end, flags)) { dig = 5; digit_end = m_digit_5->interval.end; }
    +
    2696 else if (m_digit_6->match(text, this->interval.end, end, flags)) { dig = 6; digit_end = m_digit_6->interval.end; }
    +
    2697 else if (m_digit_7->match(text, this->interval.end, end, flags)) { dig = 7; digit_end = m_digit_7->interval.end; }
    +
    2698 else if (m_digit_8->match(text, this->interval.end, end, flags)) { dig = 8; digit_end = m_digit_8->interval.end; }
    +
    2699 else if (m_digit_9->match(text, this->interval.end, end, flags)) { dig = 9; digit_end = m_digit_9->interval.end; }
    +
    2700 else if (m_digit_10->match(text, this->interval.end, end, flags)) { dig = 10; digit_end = m_digit_10->interval.end; }
    +
    2701 else if (m_digit_11->match(text, this->interval.end, end, flags)) { dig = 11; digit_end = m_digit_11->interval.end; }
    +
    2702 else if (m_digit_12->match(text, this->interval.end, end, flags)) { dig = 12; digit_end = m_digit_12->interval.end; }
    +
    2703 else if (m_digit_13->match(text, this->interval.end, end, flags)) { dig = 13; digit_end = m_digit_13->interval.end; }
    +
    2704 else if (m_digit_14->match(text, this->interval.end, end, flags)) { dig = 14; digit_end = m_digit_14->interval.end; }
    +
    2705 else if (m_digit_15->match(text, this->interval.end, end, flags)) { dig = 15; digit_end = m_digit_15->interval.end; }
    +
    2706 else break;
    +
    2707 size_t x_n = x * 16 + dig;
    +
    2708 if (x_n <= 0xffff) {
    +
    2709 x = x_n;
    +
    2710 this->interval.end = digit_end;
    +
    2711 is_empty = false;
    +
    2712 }
    +
    2713 else
    +
    2714 break;
    +
    2715 }
    +
    2716 if (is_empty) {
    +
    2717 if (compaction_i != SIZE_MAX) {
    +
    2718 // Zero compaction active: no sweat.
    +
    2719 break;
    +
    2720 }
    +
    2721 goto error;
    +
    2722 }
    +
    2723 components[i].end = this->interval.end;
    +
    2724 this->value.s6_words[i] = htons((uint16_t)x);
    +
    2725 }
    +
    2726
    +
    2727 if (compaction_i != SIZE_MAX) {
    +
    2728 // Align components right due to zero compaction.
    +
    2729 size_t j, k;
    +
    2730 for (j = 8, k = i; k > compaction_i;) {
    +
    2731 this->value.s6_words[--j] = this->value.s6_words[--k];
    + +
    2733 }
    +
    2734 for (; j > compaction_i;) {
    +
    2735 this->value.s6_words[--j] = 0;
    +
    2736 components[j].start =
    + +
    2738 }
    +
    2739 }
    +
    2740 else if (i < 8)
    +
    2741 goto error;
    +
    2742
    +
    2743 if (m_scope_id_separator && m_scope_id_separator->match(text, this->interval.end, end, flags) &&
    +
    2744 scope_id && scope_id->match(text, m_scope_id_separator->interval.end, end, flags))
    +
    2745 this->interval.end = scope_id->interval.end;
    +
    2746 else if (scope_id)
    +
    2747 scope_id->invalidate();
    +
    2748
    +
    2749 this->interval.start = start;
    +
    2750 return true;
    +
    2751
    +
    2752 error:
    +
    2753 invalidate();
    +
    2754 return false;
    +
    2755 }
    +
    2756
    +
    2757 std::shared_ptr<basic_parser<T>>
    +
    2758 m_digit_0,
    +
    2759 m_digit_1,
    +
    2760 m_digit_2,
    +
    2761 m_digit_3,
    +
    2762 m_digit_4,
    +
    2763 m_digit_5,
    +
    2764 m_digit_6,
    +
    2765 m_digit_7,
    +
    2766 m_digit_8,
    +
    2767 m_digit_9,
    +
    2768 m_digit_10,
    +
    2769 m_digit_11,
    +
    2770 m_digit_12,
    +
    2771 m_digit_13,
    +
    2772 m_digit_14,
    +
    2773 m_digit_15;
    +
    2774 std::shared_ptr<basic_parser<T>> m_separator, m_scope_id_separator;
    +
    2775 };
    -
    2775
    -
    2776 using ipv6_address = basic_ipv6_address<char>;
    -
    2777 using wipv6_address = basic_ipv6_address<wchar_t>;
    -
    2778#ifdef _UNICODE
    -
    2779 using tipv6_address = wipv6_address;
    -
    2780#else
    -
    2781 using tipv6_address = ipv6_address;
    -
    2782#endif
    -
    2783 using sgml_ipv6_address = basic_ipv6_address<char>;
    -
    2784
    -
    2788 template <class T>
    -
    - -
    2790 {
    -
    2791 public:
    - -
    2793 _In_ bool allow_idn,
    -
    2794 _In_ const std::locale& locale = std::locale()) :
    - -
    2796 m_allow_idn(allow_idn),
    -
    2797 allow_on_edge(true)
    -
    2798 {}
    -
    2799
    - -
    2801
    -
    2802 protected:
    -
    2803 virtual bool do_match(
    -
    2804 _In_reads_or_z_opt_(end) const T* text,
    -
    2805 _In_ size_t start = 0,
    -
    2806 _In_ size_t end = SIZE_MAX,
    -
    2807 _In_ int flags = match_default)
    -
    2808 {
    -
    2809 _Assume_(text || start >= end);
    -
    2810 if (start < end && text[start]) {
    -
    2811 if (('A' <= text[start] && text[start] <= 'Z') ||
    -
    2812 ('a' <= text[start] && text[start] <= 'z') ||
    -
    2813 ('0' <= text[start] && text[start] <= '9'))
    -
    2814 allow_on_edge = true;
    -
    2815 else if (text[start] == '-')
    -
    2816 allow_on_edge = false;
    -
    2817 else if (m_allow_idn && std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    -
    2818 allow_on_edge = true;
    -
    2819 else {
    -
    2820 this->interval.invalidate();
    -
    2821 return false;
    -
    2822 }
    -
    2823 this->interval.end = (this->interval.start = start) + 1;
    -
    2824 return true;
    -
    2825 }
    -
    2826 this->interval.invalidate();
    -
    2827 return false;
    -
    2828 }
    -
    2829
    -
    2830 bool m_allow_idn;
    -
    2831 };
    +
    2776
    +
    2777 using ipv6_address = basic_ipv6_address<char>;
    +
    2778 using wipv6_address = basic_ipv6_address<wchar_t>;
    +
    2779#ifdef _UNICODE
    +
    2780 using tipv6_address = wipv6_address;
    +
    2781#else
    +
    2782 using tipv6_address = ipv6_address;
    +
    2783#endif
    +
    2784 using sgml_ipv6_address = basic_ipv6_address<char>;
    +
    2785
    +
    2789 template <class T>
    +
    + +
    2791 {
    +
    2792 public:
    + +
    2794 _In_ bool allow_idn,
    +
    2795 _In_ const std::locale& locale = std::locale()) :
    + +
    2797 m_allow_idn(allow_idn),
    +
    2798 allow_on_edge(true)
    +
    2799 {}
    +
    2800
    + +
    2802
    +
    2803 protected:
    +
    2804 virtual bool do_match(
    +
    2805 _In_reads_or_z_opt_(end) const T* text,
    +
    2806 _In_ size_t start = 0,
    +
    2807 _In_ size_t end = SIZE_MAX,
    +
    2808 _In_ int flags = match_default)
    +
    2809 {
    +
    2810 _Assume_(text || start >= end);
    +
    2811 if (start < end && text[start]) {
    +
    2812 if (('A' <= text[start] && text[start] <= 'Z') ||
    +
    2813 ('a' <= text[start] && text[start] <= 'z') ||
    +
    2814 ('0' <= text[start] && text[start] <= '9'))
    +
    2815 allow_on_edge = true;
    +
    2816 else if (text[start] == '-')
    +
    2817 allow_on_edge = false;
    +
    2818 else if (m_allow_idn && std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    +
    2819 allow_on_edge = true;
    +
    2820 else {
    +
    2821 this->interval.invalidate();
    +
    2822 return false;
    +
    2823 }
    +
    2824 this->interval.end = (this->interval.start = start) + 1;
    +
    2825 return true;
    +
    2826 }
    +
    2827 this->interval.invalidate();
    +
    2828 return false;
    +
    2829 }
    +
    2830
    +
    2831 bool m_allow_idn;
    +
    2832 };
    -
    2832
    -
    2833 using dns_domain_char = basic_dns_domain_char<char>;
    -
    2834 using wdns_domain_char = basic_dns_domain_char<wchar_t>;
    -
    2835#ifdef _UNICODE
    -
    2836 using tdns_domain_char = wdns_domain_char;
    -
    2837#else
    -
    2838 using tdns_domain_char = dns_domain_char;
    -
    2839#endif
    -
    2840
    -
    - -
    2845 {
    -
    2846 public:
    - -
    2848 _In_ bool allow_idn,
    -
    2849 _In_ const std::locale& locale = std::locale()) :
    - -
    2851 {}
    -
    2852
    -
    2853 protected:
    -
    2854 virtual bool do_match(
    -
    2855 _In_reads_or_z_(end) const char* text,
    -
    2856 _In_ size_t start = 0,
    -
    2857 _In_ size_t end = SIZE_MAX,
    -
    2858 _In_ int flags = match_default)
    -
    2859 {
    -
    2860 _Assume_(text || start >= end);
    -
    2861 if (start < end && text[start]) {
    -
    2862 wchar_t buf[3];
    -
    2863 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    -
    2864 const wchar_t* chr_end = chr + stdex::strlen(chr);
    -
    2865 if ((('A' <= chr[0] && chr[0] <= 'Z') ||
    -
    2866 ('a' <= chr[0] && chr[0] <= 'z') ||
    -
    2867 ('0' <= chr[0] && chr[0] <= '9')) && chr[1] == 0)
    -
    2868 allow_on_edge = true;
    -
    2869 else if (chr[0] == '-' && chr[1] == 0)
    -
    2870 allow_on_edge = false;
    -
    2871 else if (m_allow_idn && std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    -
    2872 allow_on_edge = true;
    -
    2873 else {
    -
    2874 this->interval.invalidate();
    -
    2875 return false;
    -
    2876 }
    -
    2877 this->interval.start = start;
    -
    2878 return true;
    -
    2879 }
    -
    2880 this->interval.invalidate();
    -
    2881 return false;
    -
    2882 }
    -
    2883 };
    +
    2833
    +
    2834 using dns_domain_char = basic_dns_domain_char<char>;
    +
    2835 using wdns_domain_char = basic_dns_domain_char<wchar_t>;
    +
    2836#ifdef _UNICODE
    +
    2837 using tdns_domain_char = wdns_domain_char;
    +
    2838#else
    +
    2839 using tdns_domain_char = dns_domain_char;
    +
    2840#endif
    +
    2841
    +
    + +
    2846 {
    +
    2847 public:
    + +
    2849 _In_ bool allow_idn,
    +
    2850 _In_ const std::locale& locale = std::locale()) :
    + +
    2852 {}
    +
    2853
    +
    2854 protected:
    +
    2855 virtual bool do_match(
    +
    2856 _In_reads_or_z_(end) const char* text,
    +
    2857 _In_ size_t start = 0,
    +
    2858 _In_ size_t end = SIZE_MAX,
    +
    2859 _In_ int flags = match_default)
    +
    2860 {
    +
    2861 _Assume_(text || start >= end);
    +
    2862 if (start < end && text[start]) {
    +
    2863 wchar_t buf[3];
    +
    2864 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    +
    2865 const wchar_t* chr_end = chr + stdex::strlen(chr);
    +
    2866 if ((('A' <= chr[0] && chr[0] <= 'Z') ||
    +
    2867 ('a' <= chr[0] && chr[0] <= 'z') ||
    +
    2868 ('0' <= chr[0] && chr[0] <= '9')) && chr[1] == 0)
    +
    2869 allow_on_edge = true;
    +
    2870 else if (chr[0] == '-' && chr[1] == 0)
    +
    2871 allow_on_edge = false;
    +
    2872 else if (m_allow_idn && std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    +
    2873 allow_on_edge = true;
    +
    2874 else {
    +
    2875 this->interval.invalidate();
    +
    2876 return false;
    +
    2877 }
    +
    2878 this->interval.start = start;
    +
    2879 return true;
    +
    2880 }
    +
    2881 this->interval.invalidate();
    +
    2882 return false;
    +
    2883 }
    +
    2884 };
    -
    2884
    -
    2888 template <class T>
    -
    - -
    2890 {
    -
    2891 public:
    - -
    2893 _In_ bool allow_absolute,
    -
    2894 _In_ const std::shared_ptr<basic_dns_domain_char<T>>& domain_char,
    -
    2895 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    -
    2896 _In_ const std::locale& locale = std::locale()) :
    - - -
    2899 m_domain_char(domain_char),
    -
    2900 m_separator(separator)
    -
    2901 {}
    -
    2902
    -
    2903 protected:
    -
    2904 virtual bool do_match(
    -
    2905 _In_reads_or_z_opt_(end) const T* text,
    -
    2906 _In_ size_t start = 0,
    -
    2907 _In_ size_t end = SIZE_MAX,
    -
    2908 _In_ int flags = match_default)
    -
    2909 {
    -
    2910 _Assume_(text || start >= end);
    -
    2911 size_t i = start, count;
    -
    2912 for (count = 0; i < end && text[i] && count < 127; count++) {
    -
    2913 if (m_domain_char->match(text, i, end, flags) &&
    -
    2914 m_domain_char->allow_on_edge)
    -
    2915 {
    -
    2916 // Domain start
    -
    2917 this->interval.end = i = m_domain_char->interval.end;
    -
    2918 while (i < end && text[i]) {
    -
    2919 if (m_domain_char->allow_on_edge &&
    -
    2920 m_separator->match(text, i, end, flags))
    -
    2921 {
    -
    2922 // Domain end
    -
    2923 if (m_allow_absolute)
    -
    2924 this->interval.end = i = m_separator->interval.end;
    -
    2925 else {
    -
    2926 this->interval.end = i;
    -
    2927 i = m_separator->interval.end;
    -
    2928 }
    -
    2929 break;
    -
    2930 }
    -
    2931 if (m_domain_char->match(text, i, end, flags)) {
    -
    2932 if (m_domain_char->allow_on_edge)
    -
    2933 this->interval.end = i = m_domain_char->interval.end;
    -
    2934 else
    -
    2935 i = m_domain_char->interval.end;
    -
    2936 }
    -
    2937 else {
    -
    2938 this->interval.start = start;
    -
    2939 return true;
    -
    2940 }
    -
    2941 }
    -
    2942 }
    -
    2943 else
    -
    2944 break;
    -
    2945 }
    -
    2946 if (count) {
    -
    2947 this->interval.start = start;
    -
    2948 return true;
    -
    2949 }
    -
    2950 this->interval.invalidate();
    -
    2951 return false;
    -
    2952 }
    -
    2953
    - -
    2955 std::shared_ptr<basic_dns_domain_char<T>> m_domain_char;
    -
    2956 std::shared_ptr<basic_parser<T>> m_separator;
    -
    2957 };
    +
    2885
    +
    2889 template <class T>
    +
    + +
    2891 {
    +
    2892 public:
    + +
    2894 _In_ bool allow_absolute,
    +
    2895 _In_ const std::shared_ptr<basic_dns_domain_char<T>>& domain_char,
    +
    2896 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    +
    2897 _In_ const std::locale& locale = std::locale()) :
    + + +
    2900 m_domain_char(domain_char),
    +
    2901 m_separator(separator)
    +
    2902 {}
    +
    2903
    +
    2904 protected:
    +
    2905 virtual bool do_match(
    +
    2906 _In_reads_or_z_opt_(end) const T* text,
    +
    2907 _In_ size_t start = 0,
    +
    2908 _In_ size_t end = SIZE_MAX,
    +
    2909 _In_ int flags = match_default)
    +
    2910 {
    +
    2911 _Assume_(text || start >= end);
    +
    2912 size_t i = start, count;
    +
    2913 for (count = 0; i < end && text[i] && count < 127; count++) {
    +
    2914 if (m_domain_char->match(text, i, end, flags) &&
    +
    2915 m_domain_char->allow_on_edge)
    +
    2916 {
    +
    2917 // Domain start
    +
    2918 this->interval.end = i = m_domain_char->interval.end;
    +
    2919 while (i < end && text[i]) {
    +
    2920 if (m_domain_char->allow_on_edge &&
    +
    2921 m_separator->match(text, i, end, flags))
    +
    2922 {
    +
    2923 // Domain end
    +
    2924 if (m_allow_absolute)
    +
    2925 this->interval.end = i = m_separator->interval.end;
    +
    2926 else {
    +
    2927 this->interval.end = i;
    +
    2928 i = m_separator->interval.end;
    +
    2929 }
    +
    2930 break;
    +
    2931 }
    +
    2932 if (m_domain_char->match(text, i, end, flags)) {
    +
    2933 if (m_domain_char->allow_on_edge)
    +
    2934 this->interval.end = i = m_domain_char->interval.end;
    +
    2935 else
    +
    2936 i = m_domain_char->interval.end;
    +
    2937 }
    +
    2938 else {
    +
    2939 this->interval.start = start;
    +
    2940 return true;
    +
    2941 }
    +
    2942 }
    +
    2943 }
    +
    2944 else
    +
    2945 break;
    +
    2946 }
    +
    2947 if (count) {
    +
    2948 this->interval.start = start;
    +
    2949 return true;
    +
    2950 }
    +
    2951 this->interval.invalidate();
    +
    2952 return false;
    +
    2953 }
    +
    2954
    + +
    2956 std::shared_ptr<basic_dns_domain_char<T>> m_domain_char;
    +
    2957 std::shared_ptr<basic_parser<T>> m_separator;
    +
    2958 };
    -
    2958
    - - -
    2961#ifdef _UNICODE
    -
    2962 using tdns_name = wdns_name;
    -
    2963#else
    -
    2964 using tdns_name = dns_name;
    -
    2965#endif
    - -
    2967
    -
    2971 template <class T>
    -
    - -
    2973 {
    -
    2974 public:
    -
    2975 basic_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    2976
    -
    2977 protected:
    -
    2978 virtual bool do_match(
    -
    2979 _In_reads_or_z_opt_(end) const T* text,
    -
    2980 _In_ size_t start = 0,
    -
    2981 _In_ size_t end = SIZE_MAX,
    -
    2982 _In_ int flags = match_default)
    -
    2983 {
    -
    2984 _Assume_(text || start >= end);
    -
    2985 if (start < end && text[start]) {
    -
    2986 if (text[start] == '-' ||
    -
    2987 text[start] == '.' ||
    -
    2988 text[start] == '_' ||
    -
    2989 text[start] == '~' ||
    -
    2990 text[start] == '%' ||
    -
    2991 text[start] == '!' ||
    -
    2992 text[start] == '$' ||
    -
    2993 text[start] == '&' ||
    -
    2994 text[start] == '\'' ||
    -
    2995 //text[start] == '(' ||
    -
    2996 //text[start] == ')' ||
    -
    2997 text[start] == '*' ||
    -
    2998 text[start] == '+' ||
    -
    2999 text[start] == ',' ||
    -
    3000 text[start] == ';' ||
    -
    3001 text[start] == '=' ||
    -
    3002 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    -
    3003 {
    -
    3004 this->interval.end = (this->interval.start = start) + 1;
    -
    3005 return true;
    -
    3006 }
    -
    3007 }
    -
    3008 this->interval.invalidate();
    -
    3009 return false;
    -
    3010 }
    -
    3011 };
    +
    2959
    + + +
    2962#ifdef _UNICODE
    +
    2963 using tdns_name = wdns_name;
    +
    2964#else
    +
    2965 using tdns_name = dns_name;
    +
    2966#endif
    + +
    2968
    +
    2972 template <class T>
    +
    + +
    2974 {
    +
    2975 public:
    +
    2976 basic_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    2977
    +
    2978 protected:
    +
    2979 virtual bool do_match(
    +
    2980 _In_reads_or_z_opt_(end) const T* text,
    +
    2981 _In_ size_t start = 0,
    +
    2982 _In_ size_t end = SIZE_MAX,
    +
    2983 _In_ int flags = match_default)
    +
    2984 {
    +
    2985 _Assume_(text || start >= end);
    +
    2986 if (start < end && text[start]) {
    +
    2987 if (text[start] == '-' ||
    +
    2988 text[start] == '.' ||
    +
    2989 text[start] == '_' ||
    +
    2990 text[start] == '~' ||
    +
    2991 text[start] == '%' ||
    +
    2992 text[start] == '!' ||
    +
    2993 text[start] == '$' ||
    +
    2994 text[start] == '&' ||
    +
    2995 text[start] == '\'' ||
    +
    2996 //text[start] == '(' ||
    +
    2997 //text[start] == ')' ||
    +
    2998 text[start] == '*' ||
    +
    2999 text[start] == '+' ||
    +
    3000 text[start] == ',' ||
    +
    3001 text[start] == ';' ||
    +
    3002 text[start] == '=' ||
    +
    3003 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    +
    3004 {
    +
    3005 this->interval.end = (this->interval.start = start) + 1;
    +
    3006 return true;
    +
    3007 }
    +
    3008 }
    +
    3009 this->interval.invalidate();
    +
    3010 return false;
    +
    3011 }
    +
    3012 };
    -
    3012
    - - -
    3015#ifdef _UNICODE
    - -
    3017#else
    - -
    3019#endif
    -
    3020
    -
    - -
    3025 {
    -
    3026 public:
    -
    3027 sgml_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_url_username_char<char>(locale) {}
    -
    3028
    -
    3029 protected:
    -
    3030 virtual bool do_match(
    -
    3031 _In_reads_or_z_(end) const char* text,
    -
    3032 _In_ size_t start = 0,
    -
    3033 _In_ size_t end = SIZE_MAX,
    -
    3034 _In_ int flags = match_default)
    -
    3035 {
    -
    3036 _Assume_(text || start >= end);
    -
    3037 if (start < end && text[start]) {
    -
    3038 wchar_t buf[3];
    -
    3039 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    -
    3040 const wchar_t* chr_end = chr + stdex::strlen(chr);
    -
    3041 if (((chr[0] == L'-' ||
    -
    3042 chr[0] == L'.' ||
    -
    3043 chr[0] == L'_' ||
    -
    3044 chr[0] == L'~' ||
    -
    3045 chr[0] == L'%' ||
    -
    3046 chr[0] == L'!' ||
    -
    3047 chr[0] == L'$' ||
    -
    3048 chr[0] == L'&' ||
    -
    3049 chr[0] == L'\'' ||
    -
    3050 //chr[0] == L'(' ||
    -
    3051 //chr[0] == L')' ||
    -
    3052 chr[0] == L'*' ||
    -
    3053 chr[0] == L'+' ||
    -
    3054 chr[0] == L',' ||
    -
    3055 chr[0] == L';' ||
    -
    3056 chr[0] == L'=') && chr[1] == 0) ||
    -
    3057 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    -
    3058 {
    -
    3059 this->interval.start = start;
    -
    3060 return true;
    -
    3061 }
    -
    3062 }
    -
    3063
    -
    3064 this->interval.invalidate();
    -
    3065 return false;
    -
    3066 }
    -
    3067 };
    +
    3013
    + + +
    3016#ifdef _UNICODE
    + +
    3018#else
    + +
    3020#endif
    +
    3021
    +
    + +
    3026 {
    +
    3027 public:
    +
    3028 sgml_url_username_char(_In_ const std::locale& locale = std::locale()) : basic_url_username_char<char>(locale) {}
    +
    3029
    +
    3030 protected:
    +
    3031 virtual bool do_match(
    +
    3032 _In_reads_or_z_(end) const char* text,
    +
    3033 _In_ size_t start = 0,
    +
    3034 _In_ size_t end = SIZE_MAX,
    +
    3035 _In_ int flags = match_default)
    +
    3036 {
    +
    3037 _Assume_(text || start >= end);
    +
    3038 if (start < end && text[start]) {
    +
    3039 wchar_t buf[3];
    +
    3040 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    +
    3041 const wchar_t* chr_end = chr + stdex::strlen(chr);
    +
    3042 if (((chr[0] == L'-' ||
    +
    3043 chr[0] == L'.' ||
    +
    3044 chr[0] == L'_' ||
    +
    3045 chr[0] == L'~' ||
    +
    3046 chr[0] == L'%' ||
    +
    3047 chr[0] == L'!' ||
    +
    3048 chr[0] == L'$' ||
    +
    3049 chr[0] == L'&' ||
    +
    3050 chr[0] == L'\'' ||
    +
    3051 //chr[0] == L'(' ||
    +
    3052 //chr[0] == L')' ||
    +
    3053 chr[0] == L'*' ||
    +
    3054 chr[0] == L'+' ||
    +
    3055 chr[0] == L',' ||
    +
    3056 chr[0] == L';' ||
    +
    3057 chr[0] == L'=') && chr[1] == 0) ||
    +
    3058 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    +
    3059 {
    +
    3060 this->interval.start = start;
    +
    3061 return true;
    +
    3062 }
    +
    3063 }
    +
    3064
    +
    3065 this->interval.invalidate();
    +
    3066 return false;
    +
    3067 }
    +
    3068 };
    -
    3068
    -
    3072 template <class T>
    -
    - -
    3074 {
    -
    3075 public:
    -
    3076 basic_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    3077
    -
    3078 protected:
    -
    3079 virtual bool do_match(
    -
    3080 _In_reads_or_z_opt_(end) const T* text,
    -
    3081 _In_ size_t start = 0,
    -
    3082 _In_ size_t end = SIZE_MAX,
    -
    3083 _In_ int flags = match_default)
    -
    3084 {
    -
    3085 _Assume_(text || start >= end);
    -
    3086 if (start < end && text[start]) {
    -
    3087 if (text[start] == '-' ||
    -
    3088 text[start] == '.' ||
    -
    3089 text[start] == '_' ||
    -
    3090 text[start] == '~' ||
    -
    3091 text[start] == '%' ||
    -
    3092 text[start] == '!' ||
    -
    3093 text[start] == '$' ||
    -
    3094 text[start] == '&' ||
    -
    3095 text[start] == '\'' ||
    -
    3096 text[start] == '(' ||
    -
    3097 text[start] == ')' ||
    -
    3098 text[start] == '*' ||
    -
    3099 text[start] == '+' ||
    -
    3100 text[start] == ',' ||
    -
    3101 text[start] == ';' ||
    -
    3102 text[start] == '=' ||
    -
    3103 text[start] == ':' ||
    -
    3104 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    -
    3105 {
    -
    3106 this->interval.end = (this->interval.start = start) + 1;
    -
    3107 return true;
    -
    3108 }
    -
    3109 }
    -
    3110 this->interval.invalidate();
    -
    3111 return false;
    -
    3112 }
    -
    3113 };
    +
    3069
    +
    3073 template <class T>
    +
    + +
    3075 {
    +
    3076 public:
    +
    3077 basic_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    3078
    +
    3079 protected:
    +
    3080 virtual bool do_match(
    +
    3081 _In_reads_or_z_opt_(end) const T* text,
    +
    3082 _In_ size_t start = 0,
    +
    3083 _In_ size_t end = SIZE_MAX,
    +
    3084 _In_ int flags = match_default)
    +
    3085 {
    +
    3086 _Assume_(text || start >= end);
    +
    3087 if (start < end && text[start]) {
    +
    3088 if (text[start] == '-' ||
    +
    3089 text[start] == '.' ||
    +
    3090 text[start] == '_' ||
    +
    3091 text[start] == '~' ||
    +
    3092 text[start] == '%' ||
    +
    3093 text[start] == '!' ||
    +
    3094 text[start] == '$' ||
    +
    3095 text[start] == '&' ||
    +
    3096 text[start] == '\'' ||
    +
    3097 text[start] == '(' ||
    +
    3098 text[start] == ')' ||
    +
    3099 text[start] == '*' ||
    +
    3100 text[start] == '+' ||
    +
    3101 text[start] == ',' ||
    +
    3102 text[start] == ';' ||
    +
    3103 text[start] == '=' ||
    +
    3104 text[start] == ':' ||
    +
    3105 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    +
    3106 {
    +
    3107 this->interval.end = (this->interval.start = start) + 1;
    +
    3108 return true;
    +
    3109 }
    +
    3110 }
    +
    3111 this->interval.invalidate();
    +
    3112 return false;
    +
    3113 }
    +
    3114 };
    -
    3114
    - - -
    3117#ifdef _UNICODE
    - -
    3119#else
    - -
    3121#endif
    -
    3122
    -
    - -
    3127 {
    -
    3128 public:
    -
    3129 sgml_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_url_password_char<char>(locale) {}
    -
    3130
    -
    3131 protected:
    -
    3132 virtual bool do_match(
    -
    3133 _In_reads_or_z_(end) const char* text,
    -
    3134 _In_ size_t start = 0,
    -
    3135 _In_ size_t end = SIZE_MAX,
    -
    3136 _In_ int flags = match_default)
    -
    3137 {
    -
    3138 _Assume_(text || start >= end);
    -
    3139 if (start < end && text[start]) {
    -
    3140 wchar_t buf[3];
    -
    3141 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    -
    3142 const wchar_t* chr_end = chr + stdex::strlen(chr);
    -
    3143 if (((chr[0] == L'-' ||
    -
    3144 chr[0] == L'.' ||
    -
    3145 chr[0] == L'_' ||
    -
    3146 chr[0] == L'~' ||
    -
    3147 chr[0] == L'%' ||
    -
    3148 chr[0] == L'!' ||
    -
    3149 chr[0] == L'$' ||
    -
    3150 chr[0] == L'&' ||
    -
    3151 chr[0] == L'\'' ||
    -
    3152 chr[0] == L'(' ||
    -
    3153 chr[0] == L')' ||
    -
    3154 chr[0] == L'*' ||
    -
    3155 chr[0] == L'+' ||
    -
    3156 chr[0] == L',' ||
    -
    3157 chr[0] == L';' ||
    -
    3158 chr[0] == L'=' ||
    -
    3159 chr[0] == L':') && chr[1] == 0) ||
    -
    3160 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    -
    3161 {
    -
    3162 this->interval.start = start;
    -
    3163 return true;
    -
    3164 }
    -
    3165 }
    -
    3166 this->interval.invalidate();
    -
    3167 return false;
    -
    3168 }
    -
    3169 };
    +
    3115
    + + +
    3118#ifdef _UNICODE
    + +
    3120#else
    + +
    3122#endif
    +
    3123
    +
    + +
    3128 {
    +
    3129 public:
    +
    3130 sgml_url_password_char(_In_ const std::locale& locale = std::locale()) : basic_url_password_char<char>(locale) {}
    +
    3131
    +
    3132 protected:
    +
    3133 virtual bool do_match(
    +
    3134 _In_reads_or_z_(end) const char* text,
    +
    3135 _In_ size_t start = 0,
    +
    3136 _In_ size_t end = SIZE_MAX,
    +
    3137 _In_ int flags = match_default)
    +
    3138 {
    +
    3139 _Assume_(text || start >= end);
    +
    3140 if (start < end && text[start]) {
    +
    3141 wchar_t buf[3];
    +
    3142 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    +
    3143 const wchar_t* chr_end = chr + stdex::strlen(chr);
    +
    3144 if (((chr[0] == L'-' ||
    +
    3145 chr[0] == L'.' ||
    +
    3146 chr[0] == L'_' ||
    +
    3147 chr[0] == L'~' ||
    +
    3148 chr[0] == L'%' ||
    +
    3149 chr[0] == L'!' ||
    +
    3150 chr[0] == L'$' ||
    +
    3151 chr[0] == L'&' ||
    +
    3152 chr[0] == L'\'' ||
    +
    3153 chr[0] == L'(' ||
    +
    3154 chr[0] == L')' ||
    +
    3155 chr[0] == L'*' ||
    +
    3156 chr[0] == L'+' ||
    +
    3157 chr[0] == L',' ||
    +
    3158 chr[0] == L';' ||
    +
    3159 chr[0] == L'=' ||
    +
    3160 chr[0] == L':') && chr[1] == 0) ||
    +
    3161 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    +
    3162 {
    +
    3163 this->interval.start = start;
    +
    3164 return true;
    +
    3165 }
    +
    3166 }
    +
    3167 this->interval.invalidate();
    +
    3168 return false;
    +
    3169 }
    +
    3170 };
    -
    3170
    -
    3174 template <class T>
    -
    - -
    3176 {
    -
    3177 public:
    -
    3178 basic_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    3179
    -
    3180 protected:
    -
    3181 virtual bool do_match(
    -
    3182 _In_reads_or_z_opt_(end) const T* text,
    -
    3183 _In_ size_t start = 0,
    -
    3184 _In_ size_t end = SIZE_MAX,
    -
    3185 _In_ int flags = match_default)
    -
    3186 {
    -
    3187 _Assume_(text || start >= end);
    -
    3188 if (start < end && text[start]) {
    -
    3189 if (text[start] == '/' ||
    -
    3190 text[start] == '-' ||
    -
    3191 text[start] == '.' ||
    -
    3192 text[start] == '_' ||
    -
    3193 text[start] == '~' ||
    -
    3194 text[start] == '%' ||
    -
    3195 text[start] == '!' ||
    -
    3196 text[start] == '$' ||
    -
    3197 text[start] == '&' ||
    -
    3198 text[start] == '\'' ||
    -
    3199 text[start] == '(' ||
    -
    3200 text[start] == ')' ||
    -
    3201 text[start] == '*' ||
    -
    3202 text[start] == '+' ||
    -
    3203 text[start] == ',' ||
    -
    3204 text[start] == ';' ||
    -
    3205 text[start] == '=' ||
    -
    3206 text[start] == ':' ||
    -
    3207 text[start] == '@' ||
    -
    3208 text[start] == '?' ||
    -
    3209 text[start] == '#' ||
    -
    3210 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    -
    3211 {
    -
    3212 this->interval.end = (this->interval.start = start) + 1;
    -
    3213 return true;
    -
    3214 }
    -
    3215 }
    -
    3216 this->interval.invalidate();
    -
    3217 return false;
    -
    3218 }
    -
    3219 };
    +
    3171
    +
    3175 template <class T>
    +
    + +
    3177 {
    +
    3178 public:
    +
    3179 basic_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    3180
    +
    3181 protected:
    +
    3182 virtual bool do_match(
    +
    3183 _In_reads_or_z_opt_(end) const T* text,
    +
    3184 _In_ size_t start = 0,
    +
    3185 _In_ size_t end = SIZE_MAX,
    +
    3186 _In_ int flags = match_default)
    +
    3187 {
    +
    3188 _Assume_(text || start >= end);
    +
    3189 if (start < end && text[start]) {
    +
    3190 if (text[start] == '/' ||
    +
    3191 text[start] == '-' ||
    +
    3192 text[start] == '.' ||
    +
    3193 text[start] == '_' ||
    +
    3194 text[start] == '~' ||
    +
    3195 text[start] == '%' ||
    +
    3196 text[start] == '!' ||
    +
    3197 text[start] == '$' ||
    +
    3198 text[start] == '&' ||
    +
    3199 text[start] == '\'' ||
    +
    3200 text[start] == '(' ||
    +
    3201 text[start] == ')' ||
    +
    3202 text[start] == '*' ||
    +
    3203 text[start] == '+' ||
    +
    3204 text[start] == ',' ||
    +
    3205 text[start] == ';' ||
    +
    3206 text[start] == '=' ||
    +
    3207 text[start] == ':' ||
    +
    3208 text[start] == '@' ||
    +
    3209 text[start] == '?' ||
    +
    3210 text[start] == '#' ||
    +
    3211 std::use_facet<std::ctype<T>>(this->m_locale).is(std::ctype_base::alnum, text[start]))
    +
    3212 {
    +
    3213 this->interval.end = (this->interval.start = start) + 1;
    +
    3214 return true;
    +
    3215 }
    +
    3216 }
    +
    3217 this->interval.invalidate();
    +
    3218 return false;
    +
    3219 }
    +
    3220 };
    -
    3220
    - - -
    3223#ifdef _UNICODE
    - -
    3225#else
    - -
    3227#endif
    -
    3228
    -
    - -
    3233 {
    -
    3234 public:
    -
    3235 sgml_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_url_path_char<char>(locale) {}
    -
    3236
    -
    3237 protected:
    -
    3238 virtual bool do_match(
    -
    3239 _In_reads_or_z_(end) const char* text,
    -
    3240 _In_ size_t start = 0,
    -
    3241 _In_ size_t end = SIZE_MAX,
    -
    3242 _In_ int flags = match_default)
    -
    3243 {
    -
    3244 _Assume_(text || start >= end);
    -
    3245 if (start < end && text[start]) {
    -
    3246 wchar_t buf[3];
    -
    3247 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    -
    3248 const wchar_t* chr_end = chr + stdex::strlen(chr);
    -
    3249 if (((chr[0] == L'/' ||
    -
    3250 chr[0] == L'-' ||
    -
    3251 chr[0] == L'.' ||
    -
    3252 chr[0] == L'_' ||
    -
    3253 chr[0] == L'~' ||
    -
    3254 chr[0] == L'%' ||
    -
    3255 chr[0] == L'!' ||
    -
    3256 chr[0] == L'$' ||
    -
    3257 chr[0] == L'&' ||
    -
    3258 chr[0] == L'\'' ||
    -
    3259 chr[0] == L'(' ||
    -
    3260 chr[0] == L')' ||
    -
    3261 chr[0] == L'*' ||
    -
    3262 chr[0] == L'+' ||
    -
    3263 chr[0] == L',' ||
    -
    3264 chr[0] == L';' ||
    -
    3265 chr[0] == L'=' ||
    -
    3266 chr[0] == L':' ||
    -
    3267 chr[0] == L'@' ||
    -
    3268 chr[0] == L'?' ||
    -
    3269 chr[0] == L'#') && chr[1] == 0) ||
    -
    3270 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    -
    3271 {
    -
    3272 this->interval.start = start;
    -
    3273 return true;
    -
    3274 }
    -
    3275 }
    -
    3276 this->interval.invalidate();
    -
    3277 return false;
    -
    3278 }
    -
    3279 };
    +
    3221
    + + +
    3224#ifdef _UNICODE
    + +
    3226#else
    + +
    3228#endif
    +
    3229
    +
    + +
    3234 {
    +
    3235 public:
    +
    3236 sgml_url_path_char(_In_ const std::locale& locale = std::locale()) : basic_url_path_char<char>(locale) {}
    +
    3237
    +
    3238 protected:
    +
    3239 virtual bool do_match(
    +
    3240 _In_reads_or_z_(end) const char* text,
    +
    3241 _In_ size_t start = 0,
    +
    3242 _In_ size_t end = SIZE_MAX,
    +
    3243 _In_ int flags = match_default)
    +
    3244 {
    +
    3245 _Assume_(text || start >= end);
    +
    3246 if (start < end && text[start]) {
    +
    3247 wchar_t buf[3];
    +
    3248 const wchar_t* chr = next_sgml_cp(text, start, end, this->interval.end, buf);
    +
    3249 const wchar_t* chr_end = chr + stdex::strlen(chr);
    +
    3250 if (((chr[0] == L'/' ||
    +
    3251 chr[0] == L'-' ||
    +
    3252 chr[0] == L'.' ||
    +
    3253 chr[0] == L'_' ||
    +
    3254 chr[0] == L'~' ||
    +
    3255 chr[0] == L'%' ||
    +
    3256 chr[0] == L'!' ||
    +
    3257 chr[0] == L'$' ||
    +
    3258 chr[0] == L'&' ||
    +
    3259 chr[0] == L'\'' ||
    +
    3260 chr[0] == L'(' ||
    +
    3261 chr[0] == L')' ||
    +
    3262 chr[0] == L'*' ||
    +
    3263 chr[0] == L'+' ||
    +
    3264 chr[0] == L',' ||
    +
    3265 chr[0] == L';' ||
    +
    3266 chr[0] == L'=' ||
    +
    3267 chr[0] == L':' ||
    +
    3268 chr[0] == L'@' ||
    +
    3269 chr[0] == L'?' ||
    +
    3270 chr[0] == L'#') && chr[1] == 0) ||
    +
    3271 std::use_facet<std::ctype<wchar_t>>(m_locale).scan_not(std::ctype_base::alnum, chr, chr_end) == chr_end)
    +
    3272 {
    +
    3273 this->interval.start = start;
    +
    3274 return true;
    +
    3275 }
    +
    3276 }
    +
    3277 this->interval.invalidate();
    +
    3278 return false;
    +
    3279 }
    +
    3280 };
    -
    3280
    -
    3284 template <class T>
    -
    - -
    3286 {
    -
    3287 public:
    - -
    3289 _In_ const std::shared_ptr<basic_parser<T>>& path_char,
    -
    3290 _In_ const std::shared_ptr<basic_parser<T>>& query_start,
    -
    3291 _In_ const std::shared_ptr<basic_parser<T>>& bookmark_start,
    -
    3292 _In_ const std::locale& locale = std::locale()) :
    - -
    3294 m_path_char(path_char),
    -
    3295 m_query_start(query_start),
    -
    3296 m_bookmark_start(bookmark_start)
    -
    3297 {}
    -
    3298
    -
    3299 virtual void invalidate()
    -
    3300 {
    -
    3301 path.start = 1;
    -
    3302 path.end = 0;
    -
    3303 query.start = 1;
    -
    3304 query.end = 0;
    -
    3305 bookmark.start = 1;
    -
    3306 bookmark.end = 0;
    - -
    3308 }
    -
    3309
    - - -
    3312 stdex::interval<size_t> bookmark;
    -
    3313
    -
    3314 protected:
    -
    3315 virtual bool do_match(
    -
    3316 _In_reads_or_z_opt_(end) const T* text,
    -
    3317 _In_ size_t start = 0,
    -
    3318 _In_ size_t end = SIZE_MAX,
    -
    3319 _In_ int flags = match_default)
    -
    3320 {
    -
    3321 _Assume_(text || start >= end);
    -
    3322
    -
    3323 this->interval.end = start;
    -
    3324 path.start = start;
    -
    3325 query.start = 1;
    -
    3326 query.end = 0;
    -
    3327 bookmark.start = 1;
    -
    3328 bookmark.end = 0;
    -
    3329
    -
    3330 for (;;) {
    -
    3331 if (this->interval.end >= end || !text[this->interval.end])
    -
    3332 break;
    -
    3333 if (m_query_start->match(text, this->interval.end, end, flags)) {
    -
    3334 path.end = this->interval.end;
    -
    3335 query.start = this->interval.end = m_query_start->interval.end;
    -
    3336 for (;;) {
    -
    3337 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    3338 query.end = this->interval.end;
    -
    3339 break;
    -
    3340 }
    -
    3341 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
    -
    3342 query.end = this->interval.end;
    -
    3343 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
    -
    3344 for (;;) {
    -
    3345 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    3346 bookmark.end = this->interval.end;
    -
    3347 break;
    -
    3348 }
    -
    3349 if (m_path_char->match(text, this->interval.end, end, flags))
    -
    3350 this->interval.end = m_path_char->interval.end;
    -
    3351 else {
    -
    3352 bookmark.end = this->interval.end;
    -
    3353 break;
    -
    3354 }
    -
    3355 }
    -
    3356 this->interval.start = start;
    -
    3357 return true;
    -
    3358 }
    -
    3359 if (m_path_char->match(text, this->interval.end, end, flags))
    -
    3360 this->interval.end = m_path_char->interval.end;
    -
    3361 else {
    -
    3362 query.end = this->interval.end;
    -
    3363 break;
    -
    3364 }
    -
    3365 }
    -
    3366 this->interval.start = start;
    -
    3367 return true;
    -
    3368 }
    -
    3369 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
    -
    3370 path.end = this->interval.end;
    -
    3371 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
    -
    3372 for (;;) {
    -
    3373 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    3374 bookmark.end = this->interval.end;
    -
    3375 break;
    -
    3376 }
    -
    3377 if (m_path_char->match(text, this->interval.end, end, flags))
    -
    3378 this->interval.end = m_path_char->interval.end;
    -
    3379 else {
    -
    3380 bookmark.end = this->interval.end;
    -
    3381 break;
    -
    3382 }
    -
    3383 }
    -
    3384 this->interval.start = start;
    -
    3385 return true;
    -
    3386 }
    -
    3387 if (m_path_char->match(text, this->interval.end, end, flags))
    -
    3388 this->interval.end = m_path_char->interval.end;
    -
    3389 else
    -
    3390 break;
    -
    3391 }
    -
    3392
    - -
    3394 path.end = this->interval.end;
    -
    3395 this->interval.start = start;
    -
    3396 return true;
    -
    3397 }
    -
    3398
    -
    3399 path.start = 1;
    -
    3400 path.end = 0;
    -
    3401 bookmark.start = 1;
    -
    3402 bookmark.end = 0;
    -
    3403 this->interval.invalidate();
    -
    3404 return false;
    -
    3405 }
    -
    3406
    -
    3407 std::shared_ptr<basic_parser<T>> m_path_char;
    -
    3408 std::shared_ptr<basic_parser<T>> m_query_start;
    -
    3409 std::shared_ptr<basic_parser<T>> m_bookmark_start;
    -
    3410 };
    +
    3281
    +
    3285 template <class T>
    +
    + +
    3287 {
    +
    3288 public:
    + +
    3290 _In_ const std::shared_ptr<basic_parser<T>>& path_char,
    +
    3291 _In_ const std::shared_ptr<basic_parser<T>>& query_start,
    +
    3292 _In_ const std::shared_ptr<basic_parser<T>>& bookmark_start,
    +
    3293 _In_ const std::locale& locale = std::locale()) :
    + +
    3295 m_path_char(path_char),
    +
    3296 m_query_start(query_start),
    +
    3297 m_bookmark_start(bookmark_start)
    +
    3298 {}
    +
    3299
    +
    3300 virtual void invalidate()
    +
    3301 {
    +
    3302 path.start = 1;
    +
    3303 path.end = 0;
    +
    3304 query.start = 1;
    +
    3305 query.end = 0;
    +
    3306 bookmark.start = 1;
    +
    3307 bookmark.end = 0;
    + +
    3309 }
    +
    3310
    + + +
    3313 stdex::interval<size_t> bookmark;
    +
    3314
    +
    3315 protected:
    +
    3316 virtual bool do_match(
    +
    3317 _In_reads_or_z_opt_(end) const T* text,
    +
    3318 _In_ size_t start = 0,
    +
    3319 _In_ size_t end = SIZE_MAX,
    +
    3320 _In_ int flags = match_default)
    +
    3321 {
    +
    3322 _Assume_(text || start >= end);
    +
    3323
    +
    3324 this->interval.end = start;
    +
    3325 path.start = start;
    +
    3326 query.start = 1;
    +
    3327 query.end = 0;
    +
    3328 bookmark.start = 1;
    +
    3329 bookmark.end = 0;
    +
    3330
    +
    3331 for (;;) {
    +
    3332 if (this->interval.end >= end || !text[this->interval.end])
    +
    3333 break;
    +
    3334 if (m_query_start->match(text, this->interval.end, end, flags)) {
    +
    3335 path.end = this->interval.end;
    +
    3336 query.start = this->interval.end = m_query_start->interval.end;
    +
    3337 for (;;) {
    +
    3338 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    3339 query.end = this->interval.end;
    +
    3340 break;
    +
    3341 }
    +
    3342 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
    +
    3343 query.end = this->interval.end;
    +
    3344 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
    +
    3345 for (;;) {
    +
    3346 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    3347 bookmark.end = this->interval.end;
    +
    3348 break;
    +
    3349 }
    +
    3350 if (m_path_char->match(text, this->interval.end, end, flags))
    +
    3351 this->interval.end = m_path_char->interval.end;
    +
    3352 else {
    +
    3353 bookmark.end = this->interval.end;
    +
    3354 break;
    +
    3355 }
    +
    3356 }
    +
    3357 this->interval.start = start;
    +
    3358 return true;
    +
    3359 }
    +
    3360 if (m_path_char->match(text, this->interval.end, end, flags))
    +
    3361 this->interval.end = m_path_char->interval.end;
    +
    3362 else {
    +
    3363 query.end = this->interval.end;
    +
    3364 break;
    +
    3365 }
    +
    3366 }
    +
    3367 this->interval.start = start;
    +
    3368 return true;
    +
    3369 }
    +
    3370 if (m_bookmark_start->match(text, this->interval.end, end, flags)) {
    +
    3371 path.end = this->interval.end;
    +
    3372 bookmark.start = this->interval.end = m_bookmark_start->interval.end;
    +
    3373 for (;;) {
    +
    3374 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    3375 bookmark.end = this->interval.end;
    +
    3376 break;
    +
    3377 }
    +
    3378 if (m_path_char->match(text, this->interval.end, end, flags))
    +
    3379 this->interval.end = m_path_char->interval.end;
    +
    3380 else {
    +
    3381 bookmark.end = this->interval.end;
    +
    3382 break;
    +
    3383 }
    +
    3384 }
    +
    3385 this->interval.start = start;
    +
    3386 return true;
    +
    3387 }
    +
    3388 if (m_path_char->match(text, this->interval.end, end, flags))
    +
    3389 this->interval.end = m_path_char->interval.end;
    +
    3390 else
    +
    3391 break;
    +
    3392 }
    +
    3393
    + +
    3395 path.end = this->interval.end;
    +
    3396 this->interval.start = start;
    +
    3397 return true;
    +
    3398 }
    +
    3399
    +
    3400 path.start = 1;
    +
    3401 path.end = 0;
    +
    3402 bookmark.start = 1;
    +
    3403 bookmark.end = 0;
    +
    3404 this->interval.invalidate();
    +
    3405 return false;
    +
    3406 }
    +
    3407
    +
    3408 std::shared_ptr<basic_parser<T>> m_path_char;
    +
    3409 std::shared_ptr<basic_parser<T>> m_query_start;
    +
    3410 std::shared_ptr<basic_parser<T>> m_bookmark_start;
    +
    3411 };
    -
    3411
    - - -
    3414#ifdef _UNICODE
    -
    3415 using turl_path = wurl_path;
    -
    3416#else
    -
    3417 using turl_path = url_path;
    -
    3418#endif
    - -
    3420
    -
    3424 template <class T>
    -
    -
    3425 class basic_url : public basic_parser<T>
    -
    3426 {
    -
    3427 public:
    -
    3428 basic_url(
    -
    3429 _In_ const std::shared_ptr<basic_parser<T>>& _http_scheme,
    -
    3430 _In_ const std::shared_ptr<basic_parser<T>>& _ftp_scheme,
    -
    3431 _In_ const std::shared_ptr<basic_parser<T>>& _mailto_scheme,
    -
    3432 _In_ const std::shared_ptr<basic_parser<T>>& _file_scheme,
    -
    3433 _In_ const std::shared_ptr<basic_parser<T>>& colon,
    -
    3434 _In_ const std::shared_ptr<basic_parser<T>>& slash,
    -
    3435 _In_ const std::shared_ptr<basic_parser<T>>& _username,
    -
    3436 _In_ const std::shared_ptr<basic_parser<T>>& _password,
    -
    3437 _In_ const std::shared_ptr<basic_parser<T>>& at,
    -
    3438 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
    -
    3439 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
    -
    3440 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
    -
    3441 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
    -
    3442 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
    -
    3443 _In_ const std::shared_ptr<basic_parser<T>>& _port,
    -
    3444 _In_ const std::shared_ptr<basic_parser<T>>& _path,
    -
    3445 _In_ const std::locale& locale = std::locale()) :
    - -
    3447 http_scheme(_http_scheme),
    -
    3448 ftp_scheme(_ftp_scheme),
    -
    3449 mailto_scheme(_mailto_scheme),
    -
    3450 file_scheme(_file_scheme),
    -
    3451 m_colon(colon),
    -
    3452 m_slash(slash),
    -
    3453 username(_username),
    -
    3454 password(_password),
    -
    3455 m_at(at),
    -
    3456 m_ip_lbracket(ip_lbracket),
    -
    3457 m_ip_rbracket(ip_rbracket),
    -
    3458 ipv4_host(_ipv4_host),
    -
    3459 ipv6_host(_ipv6_host),
    -
    3460 dns_host(_dns_host),
    -
    3461 port(_port),
    -
    3462 path(_path)
    -
    3463 {}
    -
    3464
    -
    3465 virtual void invalidate()
    -
    3466 {
    -
    3467 http_scheme->invalidate();
    -
    3468 ftp_scheme->invalidate();
    -
    3469 mailto_scheme->invalidate();
    -
    3470 file_scheme->invalidate();
    -
    3471 username->invalidate();
    -
    3472 password->invalidate();
    -
    3473 ipv4_host->invalidate();
    -
    3474 ipv6_host->invalidate();
    -
    3475 dns_host->invalidate();
    -
    3476 port->invalidate();
    -
    3477 path->invalidate();
    - -
    3479 }
    -
    3480
    -
    3481 std::shared_ptr<basic_parser<T>> http_scheme;
    -
    3482 std::shared_ptr<basic_parser<T>> ftp_scheme;
    -
    3483 std::shared_ptr<basic_parser<T>> mailto_scheme;
    -
    3484 std::shared_ptr<basic_parser<T>> file_scheme;
    -
    3485 std::shared_ptr<basic_parser<T>> username;
    -
    3486 std::shared_ptr<basic_parser<T>> password;
    -
    3487 std::shared_ptr<basic_parser<T>> ipv4_host;
    -
    3488 std::shared_ptr<basic_parser<T>> ipv6_host;
    -
    3489 std::shared_ptr<basic_parser<T>> dns_host;
    -
    3490 std::shared_ptr<basic_parser<T>> port;
    -
    3491 std::shared_ptr<basic_parser<T>> path;
    -
    3492
    -
    3493 protected:
    -
    3494 virtual bool do_match(
    -
    3495 _In_reads_or_z_opt_(end) const T* text,
    -
    3496 _In_ size_t start = 0,
    -
    3497 _In_ size_t end = SIZE_MAX,
    -
    3498 _In_ int flags = match_default)
    -
    3499 {
    -
    3500 _Assume_(text || start >= end);
    -
    3501
    -
    3502 this->interval.end = start;
    -
    3503
    -
    3504 if (http_scheme->match(text, this->interval.end, end, flags) &&
    -
    3505 m_colon->match(text, http_scheme->interval.end, end, flags) &&
    -
    3506 m_slash->match(text, m_colon->interval.end, end, flags) &&
    -
    3507 m_slash->match(text, m_slash->interval.end, end, flags))
    -
    3508 {
    -
    3509 // http://
    -
    3510 this->interval.end = m_slash->interval.end;
    -
    3511 ftp_scheme->invalidate();
    -
    3512 mailto_scheme->invalidate();
    -
    3513 file_scheme->invalidate();
    -
    3514 }
    -
    3515 else if (ftp_scheme->match(text, this->interval.end, end, flags) &&
    -
    3516 m_colon->match(text, ftp_scheme->interval.end, end, flags) &&
    -
    3517 m_slash->match(text, m_colon->interval.end, end, flags) &&
    -
    3518 m_slash->match(text, m_slash->interval.end, end, flags))
    -
    3519 {
    -
    3520 // ftp://
    -
    3521 this->interval.end = m_slash->interval.end;
    -
    3522 http_scheme->invalidate();
    -
    3523 mailto_scheme->invalidate();
    -
    3524 file_scheme->invalidate();
    -
    3525 }
    -
    3526 else if (mailto_scheme->match(text, this->interval.end, end, flags) &&
    -
    3527 m_colon->match(text, mailto_scheme->interval.end, end, flags))
    -
    3528 {
    -
    3529 // mailto:
    -
    3530 this->interval.end = m_colon->interval.end;
    -
    3531 http_scheme->invalidate();
    -
    3532 ftp_scheme->invalidate();
    -
    3533 file_scheme->invalidate();
    -
    3534 }
    -
    3535 else if (file_scheme->match(text, this->interval.end, end, flags) &&
    -
    3536 m_colon->match(text, file_scheme->interval.end, end, flags) &&
    -
    3537 m_slash->match(text, m_colon->interval.end, end, flags) &&
    -
    3538 m_slash->match(text, m_slash->interval.end, end, flags))
    -
    3539 {
    -
    3540 // file://
    -
    3541 this->interval.end = m_slash->interval.end;
    -
    3542 http_scheme->invalidate();
    -
    3543 ftp_scheme->invalidate();
    -
    3544 mailto_scheme->invalidate();
    -
    3545 }
    -
    3546 else {
    -
    3547 // Default to http:
    -
    3548 http_scheme->invalidate();
    -
    3549 ftp_scheme->invalidate();
    -
    3550 mailto_scheme->invalidate();
    -
    3551 file_scheme->invalidate();
    -
    3552 }
    -
    3553
    -
    3554 if (ftp_scheme->interval) {
    -
    3555 if (username->match(text, this->interval.end, end, flags)) {
    -
    3556 if (m_colon->match(text, username->interval.end, end, flags) &&
    -
    3557 password->match(text, m_colon->interval.end, end, flags) &&
    -
    3558 m_at->match(text, password->interval.end, end, flags))
    -
    3559 {
    -
    3560 // Username and password
    -
    3561 this->interval.end = m_at->interval.end;
    -
    3562 }
    -
    3563 else if (m_at->match(text, this->interval.end, end, flags)) {
    -
    3564 // Username only
    -
    3565 this->interval.end = m_at->interval.end;
    -
    3566 password->invalidate();
    -
    3567 }
    -
    3568 else {
    -
    3569 username->invalidate();
    -
    3570 password->invalidate();
    -
    3571 }
    -
    3572 }
    -
    3573 else {
    -
    3574 username->invalidate();
    -
    3575 password->invalidate();
    -
    3576 }
    -
    3577
    -
    3578 if (ipv4_host->match(text, this->interval.end, end, flags)) {
    -
    3579 // Host is IPv4
    -
    3580 this->interval.end = ipv4_host->interval.end;
    -
    3581 ipv6_host->invalidate();
    -
    3582 dns_host->invalidate();
    -
    3583 }
    -
    3584 else if (
    -
    3585 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    -
    3586 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3587 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    -
    3588 {
    -
    3589 // Host is IPv6
    -
    3590 this->interval.end = m_ip_rbracket->interval.end;
    -
    3591 ipv4_host->invalidate();
    -
    3592 dns_host->invalidate();
    -
    3593 }
    -
    3594 else if (dns_host->match(text, this->interval.end, end, flags)) {
    -
    3595 // Host is hostname
    -
    3596 this->interval.end = dns_host->interval.end;
    -
    3597 ipv4_host->invalidate();
    -
    3598 ipv6_host->invalidate();
    -
    3599 }
    -
    3600 else {
    -
    3601 invalidate();
    -
    3602 return false;
    -
    3603 }
    -
    3604
    -
    3605 if (m_colon->match(text, this->interval.end, end, flags) &&
    -
    3606 port->match(text, m_colon->interval.end, end, flags))
    -
    3607 {
    -
    3608 // Port
    -
    3609 this->interval.end = port->interval.end;
    -
    3610 }
    -
    3611 else
    -
    3612 port->invalidate();
    -
    3613
    -
    3614 if (path->match(text, this->interval.end, end, flags)) {
    -
    3615 // Path
    -
    3616 this->interval.end = path->interval.end;
    -
    3617 }
    -
    3618
    -
    3619 this->interval.start = start;
    -
    3620 return true;
    -
    3621 }
    -
    3622
    -
    3623 if (mailto_scheme->interval) {
    -
    3624 if (username->match(text, this->interval.end, end, flags) &&
    -
    3625 m_at->match(text, username->interval.end, end, flags))
    -
    3626 {
    -
    3627 // Username
    -
    3628 this->interval.end = m_at->interval.end;
    -
    3629 }
    -
    3630 else {
    -
    3631 invalidate();
    -
    3632 return false;
    -
    3633 }
    -
    3634
    -
    3635 if (m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    -
    3636 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3637 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
    -
    3638 {
    -
    3639 // Host is IPv4
    -
    3640 this->interval.end = m_ip_rbracket->interval.end;
    -
    3641 ipv6_host->invalidate();
    -
    3642 dns_host->invalidate();
    -
    3643 }
    -
    3644 else if (
    -
    3645 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    -
    3646 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3647 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    -
    3648 {
    -
    3649 // Host is IPv6
    -
    3650 this->interval.end = m_ip_rbracket->interval.end;
    -
    3651 ipv4_host->invalidate();
    -
    3652 dns_host->invalidate();
    -
    3653 }
    -
    3654 else if (dns_host->match(text, this->interval.end, end, flags)) {
    -
    3655 // Host is hostname
    -
    3656 this->interval.end = dns_host->interval.end;
    -
    3657 ipv4_host->invalidate();
    -
    3658 ipv6_host->invalidate();
    -
    3659 }
    -
    3660 else {
    -
    3661 invalidate();
    -
    3662 return false;
    -
    3663 }
    -
    3664
    -
    3665 password->invalidate();
    -
    3666 port->invalidate();
    -
    3667 path->invalidate();
    -
    3668 this->interval.start = start;
    -
    3669 return true;
    -
    3670 }
    -
    3671
    -
    3672 if (file_scheme->interval) {
    -
    3673 if (path->match(text, this->interval.end, end, flags)) {
    -
    3674 // Path
    -
    3675 this->interval.end = path->interval.end;
    -
    3676 }
    -
    3677
    -
    3678 username->invalidate();
    -
    3679 password->invalidate();
    -
    3680 ipv4_host->invalidate();
    -
    3681 ipv6_host->invalidate();
    -
    3682 dns_host->invalidate();
    -
    3683 port->invalidate();
    -
    3684 this->interval.start = start;
    -
    3685 return true;
    -
    3686 }
    -
    3687
    -
    3688 // "http://" found or defaulted to
    -
    3689
    -
    3690 // If "http://" explicit, test for username&password.
    -
    3691 if (http_scheme->interval &&
    -
    3692 username->match(text, this->interval.end, end, flags))
    -
    3693 {
    -
    3694 if (m_colon->match(text, username->interval.end, end, flags) &&
    -
    3695 password->match(text, m_colon->interval.end, end, flags) &&
    -
    3696 m_at->match(text, password->interval.end, end, flags))
    -
    3697 {
    -
    3698 // Username and password
    -
    3699 this->interval.end = m_at->interval.end;
    -
    3700 }
    -
    3701 else if (m_at->match(text, username->interval.end, end, flags)) {
    -
    3702 // Username only
    -
    3703 this->interval.end = m_at->interval.end;
    -
    3704 password->invalidate();
    -
    3705 }
    -
    3706 else {
    -
    3707 username->invalidate();
    -
    3708 password->invalidate();
    -
    3709 }
    -
    3710 }
    -
    3711 else {
    -
    3712 username->invalidate();
    -
    3713 password->invalidate();
    -
    3714 }
    -
    3715
    -
    3716 if (ipv4_host->match(text, this->interval.end, end, flags)) {
    -
    3717 // Host is IPv4
    -
    3718 this->interval.end = ipv4_host->interval.end;
    -
    3719 ipv6_host->invalidate();
    -
    3720 dns_host->invalidate();
    -
    3721 }
    -
    3722 else if (
    -
    3723 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    -
    3724 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3725 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    -
    3726 {
    -
    3727 // Host is IPv6
    -
    3728 this->interval.end = m_ip_rbracket->interval.end;
    -
    3729 ipv4_host->invalidate();
    -
    3730 dns_host->invalidate();
    -
    3731 }
    -
    3732 else if (dns_host->match(text, this->interval.end, end, flags)) {
    -
    3733 // Host is hostname
    -
    3734 this->interval.end = dns_host->interval.end;
    -
    3735 ipv4_host->invalidate();
    -
    3736 ipv6_host->invalidate();
    -
    3737 }
    -
    3738 else {
    -
    3739 invalidate();
    -
    3740 return false;
    -
    3741 }
    -
    3742
    -
    3743 if (m_colon->match(text, this->interval.end, end, flags) &&
    -
    3744 port->match(text, m_colon->interval.end, end, flags))
    -
    3745 {
    -
    3746 // Port
    -
    3747 this->interval.end = port->interval.end;
    -
    3748 }
    -
    3749 else
    -
    3750 port->invalidate();
    -
    3751
    -
    3752 if (path->match(text, this->interval.end, end, flags)) {
    -
    3753 // Path
    -
    3754 this->interval.end = path->interval.end;
    -
    3755 }
    -
    3756
    -
    3757 this->interval.start = start;
    -
    3758 return true;
    -
    3759 }
    -
    3760
    -
    3761 std::shared_ptr<basic_parser<T>> m_colon;
    -
    3762 std::shared_ptr<basic_parser<T>> m_slash;
    -
    3763 std::shared_ptr<basic_parser<T>> m_at;
    -
    3764 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
    -
    3765 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
    -
    3766 };
    +
    3412
    + + +
    3415#ifdef _UNICODE
    +
    3416 using turl_path = wurl_path;
    +
    3417#else
    +
    3418 using turl_path = url_path;
    +
    3419#endif
    + +
    3421
    +
    3425 template <class T>
    +
    +
    3426 class basic_url : public basic_parser<T>
    +
    3427 {
    +
    3428 public:
    +
    3429 basic_url(
    +
    3430 _In_ const std::shared_ptr<basic_parser<T>>& _http_scheme,
    +
    3431 _In_ const std::shared_ptr<basic_parser<T>>& _ftp_scheme,
    +
    3432 _In_ const std::shared_ptr<basic_parser<T>>& _mailto_scheme,
    +
    3433 _In_ const std::shared_ptr<basic_parser<T>>& _file_scheme,
    +
    3434 _In_ const std::shared_ptr<basic_parser<T>>& colon,
    +
    3435 _In_ const std::shared_ptr<basic_parser<T>>& slash,
    +
    3436 _In_ const std::shared_ptr<basic_parser<T>>& _username,
    +
    3437 _In_ const std::shared_ptr<basic_parser<T>>& _password,
    +
    3438 _In_ const std::shared_ptr<basic_parser<T>>& at,
    +
    3439 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
    +
    3440 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
    +
    3441 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
    +
    3442 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
    +
    3443 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
    +
    3444 _In_ const std::shared_ptr<basic_parser<T>>& _port,
    +
    3445 _In_ const std::shared_ptr<basic_parser<T>>& _path,
    +
    3446 _In_ const std::locale& locale = std::locale()) :
    + +
    3448 http_scheme(_http_scheme),
    +
    3449 ftp_scheme(_ftp_scheme),
    +
    3450 mailto_scheme(_mailto_scheme),
    +
    3451 file_scheme(_file_scheme),
    +
    3452 m_colon(colon),
    +
    3453 m_slash(slash),
    +
    3454 username(_username),
    +
    3455 password(_password),
    +
    3456 m_at(at),
    +
    3457 m_ip_lbracket(ip_lbracket),
    +
    3458 m_ip_rbracket(ip_rbracket),
    +
    3459 ipv4_host(_ipv4_host),
    +
    3460 ipv6_host(_ipv6_host),
    +
    3461 dns_host(_dns_host),
    +
    3462 port(_port),
    +
    3463 path(_path)
    +
    3464 {}
    +
    3465
    +
    3466 virtual void invalidate()
    +
    3467 {
    +
    3468 http_scheme->invalidate();
    +
    3469 ftp_scheme->invalidate();
    +
    3470 mailto_scheme->invalidate();
    +
    3471 file_scheme->invalidate();
    +
    3472 username->invalidate();
    +
    3473 password->invalidate();
    +
    3474 ipv4_host->invalidate();
    +
    3475 ipv6_host->invalidate();
    +
    3476 dns_host->invalidate();
    +
    3477 port->invalidate();
    +
    3478 path->invalidate();
    + +
    3480 }
    +
    3481
    +
    3482 std::shared_ptr<basic_parser<T>> http_scheme;
    +
    3483 std::shared_ptr<basic_parser<T>> ftp_scheme;
    +
    3484 std::shared_ptr<basic_parser<T>> mailto_scheme;
    +
    3485 std::shared_ptr<basic_parser<T>> file_scheme;
    +
    3486 std::shared_ptr<basic_parser<T>> username;
    +
    3487 std::shared_ptr<basic_parser<T>> password;
    +
    3488 std::shared_ptr<basic_parser<T>> ipv4_host;
    +
    3489 std::shared_ptr<basic_parser<T>> ipv6_host;
    +
    3490 std::shared_ptr<basic_parser<T>> dns_host;
    +
    3491 std::shared_ptr<basic_parser<T>> port;
    +
    3492 std::shared_ptr<basic_parser<T>> path;
    +
    3493
    +
    3494 protected:
    +
    3495 virtual bool do_match(
    +
    3496 _In_reads_or_z_opt_(end) const T* text,
    +
    3497 _In_ size_t start = 0,
    +
    3498 _In_ size_t end = SIZE_MAX,
    +
    3499 _In_ int flags = match_default)
    +
    3500 {
    +
    3501 _Assume_(text || start >= end);
    +
    3502
    +
    3503 this->interval.end = start;
    +
    3504
    +
    3505 if (http_scheme->match(text, this->interval.end, end, flags) &&
    +
    3506 m_colon->match(text, http_scheme->interval.end, end, flags) &&
    +
    3507 m_slash->match(text, m_colon->interval.end, end, flags) &&
    +
    3508 m_slash->match(text, m_slash->interval.end, end, flags))
    +
    3509 {
    +
    3510 // http://
    +
    3511 this->interval.end = m_slash->interval.end;
    +
    3512 ftp_scheme->invalidate();
    +
    3513 mailto_scheme->invalidate();
    +
    3514 file_scheme->invalidate();
    +
    3515 }
    +
    3516 else if (ftp_scheme->match(text, this->interval.end, end, flags) &&
    +
    3517 m_colon->match(text, ftp_scheme->interval.end, end, flags) &&
    +
    3518 m_slash->match(text, m_colon->interval.end, end, flags) &&
    +
    3519 m_slash->match(text, m_slash->interval.end, end, flags))
    +
    3520 {
    +
    3521 // ftp://
    +
    3522 this->interval.end = m_slash->interval.end;
    +
    3523 http_scheme->invalidate();
    +
    3524 mailto_scheme->invalidate();
    +
    3525 file_scheme->invalidate();
    +
    3526 }
    +
    3527 else if (mailto_scheme->match(text, this->interval.end, end, flags) &&
    +
    3528 m_colon->match(text, mailto_scheme->interval.end, end, flags))
    +
    3529 {
    +
    3530 // mailto:
    +
    3531 this->interval.end = m_colon->interval.end;
    +
    3532 http_scheme->invalidate();
    +
    3533 ftp_scheme->invalidate();
    +
    3534 file_scheme->invalidate();
    +
    3535 }
    +
    3536 else if (file_scheme->match(text, this->interval.end, end, flags) &&
    +
    3537 m_colon->match(text, file_scheme->interval.end, end, flags) &&
    +
    3538 m_slash->match(text, m_colon->interval.end, end, flags) &&
    +
    3539 m_slash->match(text, m_slash->interval.end, end, flags))
    +
    3540 {
    +
    3541 // file://
    +
    3542 this->interval.end = m_slash->interval.end;
    +
    3543 http_scheme->invalidate();
    +
    3544 ftp_scheme->invalidate();
    +
    3545 mailto_scheme->invalidate();
    +
    3546 }
    +
    3547 else {
    +
    3548 // Default to http:
    +
    3549 http_scheme->invalidate();
    +
    3550 ftp_scheme->invalidate();
    +
    3551 mailto_scheme->invalidate();
    +
    3552 file_scheme->invalidate();
    +
    3553 }
    +
    3554
    +
    3555 if (ftp_scheme->interval) {
    +
    3556 if (username->match(text, this->interval.end, end, flags)) {
    +
    3557 if (m_colon->match(text, username->interval.end, end, flags) &&
    +
    3558 password->match(text, m_colon->interval.end, end, flags) &&
    +
    3559 m_at->match(text, password->interval.end, end, flags))
    +
    3560 {
    +
    3561 // Username and password
    +
    3562 this->interval.end = m_at->interval.end;
    +
    3563 }
    +
    3564 else if (m_at->match(text, this->interval.end, end, flags)) {
    +
    3565 // Username only
    +
    3566 this->interval.end = m_at->interval.end;
    +
    3567 password->invalidate();
    +
    3568 }
    +
    3569 else {
    +
    3570 username->invalidate();
    +
    3571 password->invalidate();
    +
    3572 }
    +
    3573 }
    +
    3574 else {
    +
    3575 username->invalidate();
    +
    3576 password->invalidate();
    +
    3577 }
    +
    3578
    +
    3579 if (ipv4_host->match(text, this->interval.end, end, flags)) {
    +
    3580 // Host is IPv4
    +
    3581 this->interval.end = ipv4_host->interval.end;
    +
    3582 ipv6_host->invalidate();
    +
    3583 dns_host->invalidate();
    +
    3584 }
    +
    3585 else if (
    +
    3586 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    +
    3587 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3588 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    +
    3589 {
    +
    3590 // Host is IPv6
    +
    3591 this->interval.end = m_ip_rbracket->interval.end;
    +
    3592 ipv4_host->invalidate();
    +
    3593 dns_host->invalidate();
    +
    3594 }
    +
    3595 else if (dns_host->match(text, this->interval.end, end, flags)) {
    +
    3596 // Host is hostname
    +
    3597 this->interval.end = dns_host->interval.end;
    +
    3598 ipv4_host->invalidate();
    +
    3599 ipv6_host->invalidate();
    +
    3600 }
    +
    3601 else {
    +
    3602 invalidate();
    +
    3603 return false;
    +
    3604 }
    +
    3605
    +
    3606 if (m_colon->match(text, this->interval.end, end, flags) &&
    +
    3607 port->match(text, m_colon->interval.end, end, flags))
    +
    3608 {
    +
    3609 // Port
    +
    3610 this->interval.end = port->interval.end;
    +
    3611 }
    +
    3612 else
    +
    3613 port->invalidate();
    +
    3614
    +
    3615 if (path->match(text, this->interval.end, end, flags)) {
    +
    3616 // Path
    +
    3617 this->interval.end = path->interval.end;
    +
    3618 }
    +
    3619
    +
    3620 this->interval.start = start;
    +
    3621 return true;
    +
    3622 }
    +
    3623
    +
    3624 if (mailto_scheme->interval) {
    +
    3625 if (username->match(text, this->interval.end, end, flags) &&
    +
    3626 m_at->match(text, username->interval.end, end, flags))
    +
    3627 {
    +
    3628 // Username
    +
    3629 this->interval.end = m_at->interval.end;
    +
    3630 }
    +
    3631 else {
    +
    3632 invalidate();
    +
    3633 return false;
    +
    3634 }
    +
    3635
    +
    3636 if (m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    +
    3637 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3638 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
    +
    3639 {
    +
    3640 // Host is IPv4
    +
    3641 this->interval.end = m_ip_rbracket->interval.end;
    +
    3642 ipv6_host->invalidate();
    +
    3643 dns_host->invalidate();
    +
    3644 }
    +
    3645 else if (
    +
    3646 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    +
    3647 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3648 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    +
    3649 {
    +
    3650 // Host is IPv6
    +
    3651 this->interval.end = m_ip_rbracket->interval.end;
    +
    3652 ipv4_host->invalidate();
    +
    3653 dns_host->invalidate();
    +
    3654 }
    +
    3655 else if (dns_host->match(text, this->interval.end, end, flags)) {
    +
    3656 // Host is hostname
    +
    3657 this->interval.end = dns_host->interval.end;
    +
    3658 ipv4_host->invalidate();
    +
    3659 ipv6_host->invalidate();
    +
    3660 }
    +
    3661 else {
    +
    3662 invalidate();
    +
    3663 return false;
    +
    3664 }
    +
    3665
    +
    3666 password->invalidate();
    +
    3667 port->invalidate();
    +
    3668 path->invalidate();
    +
    3669 this->interval.start = start;
    +
    3670 return true;
    +
    3671 }
    +
    3672
    +
    3673 if (file_scheme->interval) {
    +
    3674 if (path->match(text, this->interval.end, end, flags)) {
    +
    3675 // Path
    +
    3676 this->interval.end = path->interval.end;
    +
    3677 }
    +
    3678
    +
    3679 username->invalidate();
    +
    3680 password->invalidate();
    +
    3681 ipv4_host->invalidate();
    +
    3682 ipv6_host->invalidate();
    +
    3683 dns_host->invalidate();
    +
    3684 port->invalidate();
    +
    3685 this->interval.start = start;
    +
    3686 return true;
    +
    3687 }
    +
    3688
    +
    3689 // "http://" found or defaulted to
    +
    3690
    +
    3691 // If "http://" explicit, test for username&password.
    +
    3692 if (http_scheme->interval &&
    +
    3693 username->match(text, this->interval.end, end, flags))
    +
    3694 {
    +
    3695 if (m_colon->match(text, username->interval.end, end, flags) &&
    +
    3696 password->match(text, m_colon->interval.end, end, flags) &&
    +
    3697 m_at->match(text, password->interval.end, end, flags))
    +
    3698 {
    +
    3699 // Username and password
    +
    3700 this->interval.end = m_at->interval.end;
    +
    3701 }
    +
    3702 else if (m_at->match(text, username->interval.end, end, flags)) {
    +
    3703 // Username only
    +
    3704 this->interval.end = m_at->interval.end;
    +
    3705 password->invalidate();
    +
    3706 }
    +
    3707 else {
    +
    3708 username->invalidate();
    +
    3709 password->invalidate();
    +
    3710 }
    +
    3711 }
    +
    3712 else {
    +
    3713 username->invalidate();
    +
    3714 password->invalidate();
    +
    3715 }
    +
    3716
    +
    3717 if (ipv4_host->match(text, this->interval.end, end, flags)) {
    +
    3718 // Host is IPv4
    +
    3719 this->interval.end = ipv4_host->interval.end;
    +
    3720 ipv6_host->invalidate();
    +
    3721 dns_host->invalidate();
    +
    3722 }
    +
    3723 else if (
    +
    3724 m_ip_lbracket->match(text, this->interval.end, end, flags) &&
    +
    3725 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3726 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    +
    3727 {
    +
    3728 // Host is IPv6
    +
    3729 this->interval.end = m_ip_rbracket->interval.end;
    +
    3730 ipv4_host->invalidate();
    +
    3731 dns_host->invalidate();
    +
    3732 }
    +
    3733 else if (dns_host->match(text, this->interval.end, end, flags)) {
    +
    3734 // Host is hostname
    +
    3735 this->interval.end = dns_host->interval.end;
    +
    3736 ipv4_host->invalidate();
    +
    3737 ipv6_host->invalidate();
    +
    3738 }
    +
    3739 else {
    +
    3740 invalidate();
    +
    3741 return false;
    +
    3742 }
    +
    3743
    +
    3744 if (m_colon->match(text, this->interval.end, end, flags) &&
    +
    3745 port->match(text, m_colon->interval.end, end, flags))
    +
    3746 {
    +
    3747 // Port
    +
    3748 this->interval.end = port->interval.end;
    +
    3749 }
    +
    3750 else
    +
    3751 port->invalidate();
    +
    3752
    +
    3753 if (path->match(text, this->interval.end, end, flags)) {
    +
    3754 // Path
    +
    3755 this->interval.end = path->interval.end;
    +
    3756 }
    +
    3757
    +
    3758 this->interval.start = start;
    +
    3759 return true;
    +
    3760 }
    +
    3761
    +
    3762 std::shared_ptr<basic_parser<T>> m_colon;
    +
    3763 std::shared_ptr<basic_parser<T>> m_slash;
    +
    3764 std::shared_ptr<basic_parser<T>> m_at;
    +
    3765 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
    +
    3766 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
    +
    3767 };
    -
    3767
    -
    3768 using url = basic_url<char>;
    -
    3769 using wurl = basic_url<wchar_t>;
    -
    3770#ifdef _UNICODE
    -
    3771 using turl = wurl;
    -
    3772#else
    -
    3773 using turl = url;
    -
    3774#endif
    -
    3775 using sgml_url = basic_url<char>;
    -
    3776
    -
    3780 template <class T>
    -
    - -
    3782 {
    -
    3783 public:
    - -
    3785 _In_ const std::shared_ptr<basic_parser<T>>& _username,
    -
    3786 _In_ const std::shared_ptr<basic_parser<T>>& at,
    -
    3787 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
    -
    3788 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
    -
    3789 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
    -
    3790 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
    -
    3791 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
    -
    3792 _In_ const std::locale& locale = std::locale()) :
    - -
    3794 username(_username),
    -
    3795 m_at(at),
    -
    3796 m_ip_lbracket(ip_lbracket),
    -
    3797 m_ip_rbracket(ip_rbracket),
    -
    3798 ipv4_host(_ipv4_host),
    -
    3799 ipv6_host(_ipv6_host),
    -
    3800 dns_host(_dns_host)
    -
    3801 {}
    -
    3802
    -
    3803 virtual void invalidate()
    -
    3804 {
    -
    3805 username->invalidate();
    -
    3806 ipv4_host->invalidate();
    -
    3807 ipv6_host->invalidate();
    -
    3808 dns_host->invalidate();
    - -
    3810 }
    -
    3811
    -
    3812 std::shared_ptr<basic_parser<T>> username;
    -
    3813 std::shared_ptr<basic_parser<T>> ipv4_host;
    -
    3814 std::shared_ptr<basic_parser<T>> ipv6_host;
    -
    3815 std::shared_ptr<basic_parser<T>> dns_host;
    -
    3816
    -
    3817 protected:
    -
    3818 virtual bool do_match(
    -
    3819 _In_reads_or_z_opt_(end) const T* text,
    -
    3820 _In_ size_t start = 0,
    -
    3821 _In_ size_t end = SIZE_MAX,
    -
    3822 _In_ int flags = match_default)
    -
    3823 {
    -
    3824 _Assume_(text || start >= end);
    -
    3825
    -
    3826 if (username->match(text, start, end, flags) &&
    -
    3827 m_at->match(text, username->interval.end, end, flags))
    -
    3828 {
    -
    3829 // Username@
    -
    3830 if (m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
    -
    3831 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3832 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
    -
    3833 {
    -
    3834 // Host is IPv4
    -
    3835 this->interval.end = m_ip_rbracket->interval.end;
    -
    3836 ipv6_host->invalidate();
    -
    3837 dns_host->invalidate();
    -
    3838 }
    -
    3839 else if (
    -
    3840 m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
    -
    3841 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    -
    3842 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    -
    3843 {
    -
    3844 // Host is IPv6
    -
    3845 this->interval.end = m_ip_rbracket->interval.end;
    -
    3846 ipv4_host->invalidate();
    -
    3847 dns_host->invalidate();
    -
    3848 }
    -
    3849 else if (dns_host->match(text, m_at->interval.end, end, flags)) {
    -
    3850 // Host is hostname
    -
    3851 this->interval.end = dns_host->interval.end;
    -
    3852 ipv4_host->invalidate();
    -
    3853 ipv6_host->invalidate();
    -
    3854 }
    -
    3855 else
    -
    3856 goto error;
    -
    3857 this->interval.start = start;
    -
    3858 return true;
    -
    3859 }
    -
    3860
    -
    3861 error:
    -
    3862 invalidate();
    -
    3863 return false;
    -
    3864 }
    -
    3865
    -
    3866 std::shared_ptr<basic_parser<T>> m_at;
    -
    3867 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
    -
    3868 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
    -
    3869 };
    +
    3768
    +
    3769 using url = basic_url<char>;
    +
    3770 using wurl = basic_url<wchar_t>;
    +
    3771#ifdef _UNICODE
    +
    3772 using turl = wurl;
    +
    3773#else
    +
    3774 using turl = url;
    +
    3775#endif
    +
    3776 using sgml_url = basic_url<char>;
    +
    3777
    +
    3781 template <class T>
    +
    + +
    3783 {
    +
    3784 public:
    + +
    3786 _In_ const std::shared_ptr<basic_parser<T>>& _username,
    +
    3787 _In_ const std::shared_ptr<basic_parser<T>>& at,
    +
    3788 _In_ const std::shared_ptr<basic_parser<T>>& ip_lbracket,
    +
    3789 _In_ const std::shared_ptr<basic_parser<T>>& ip_rbracket,
    +
    3790 _In_ const std::shared_ptr<basic_parser<T>>& _ipv4_host,
    +
    3791 _In_ const std::shared_ptr<basic_parser<T>>& _ipv6_host,
    +
    3792 _In_ const std::shared_ptr<basic_parser<T>>& _dns_host,
    +
    3793 _In_ const std::locale& locale = std::locale()) :
    + +
    3795 username(_username),
    +
    3796 m_at(at),
    +
    3797 m_ip_lbracket(ip_lbracket),
    +
    3798 m_ip_rbracket(ip_rbracket),
    +
    3799 ipv4_host(_ipv4_host),
    +
    3800 ipv6_host(_ipv6_host),
    +
    3801 dns_host(_dns_host)
    +
    3802 {}
    +
    3803
    +
    3804 virtual void invalidate()
    +
    3805 {
    +
    3806 username->invalidate();
    +
    3807 ipv4_host->invalidate();
    +
    3808 ipv6_host->invalidate();
    +
    3809 dns_host->invalidate();
    + +
    3811 }
    +
    3812
    +
    3813 std::shared_ptr<basic_parser<T>> username;
    +
    3814 std::shared_ptr<basic_parser<T>> ipv4_host;
    +
    3815 std::shared_ptr<basic_parser<T>> ipv6_host;
    +
    3816 std::shared_ptr<basic_parser<T>> dns_host;
    +
    3817
    +
    3818 protected:
    +
    3819 virtual bool do_match(
    +
    3820 _In_reads_or_z_opt_(end) const T* text,
    +
    3821 _In_ size_t start = 0,
    +
    3822 _In_ size_t end = SIZE_MAX,
    +
    3823 _In_ int flags = match_default)
    +
    3824 {
    +
    3825 _Assume_(text || start >= end);
    +
    3826
    +
    3827 if (username->match(text, start, end, flags) &&
    +
    3828 m_at->match(text, username->interval.end, end, flags))
    +
    3829 {
    +
    3830 // Username@
    +
    3831 if (m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
    +
    3832 ipv4_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3833 m_ip_rbracket->match(text, ipv4_host->interval.end, end, flags))
    +
    3834 {
    +
    3835 // Host is IPv4
    +
    3836 this->interval.end = m_ip_rbracket->interval.end;
    +
    3837 ipv6_host->invalidate();
    +
    3838 dns_host->invalidate();
    +
    3839 }
    +
    3840 else if (
    +
    3841 m_ip_lbracket->match(text, m_at->interval.end, end, flags) &&
    +
    3842 ipv6_host->match(text, m_ip_lbracket->interval.end, end, flags) &&
    +
    3843 m_ip_rbracket->match(text, ipv6_host->interval.end, end, flags))
    +
    3844 {
    +
    3845 // Host is IPv6
    +
    3846 this->interval.end = m_ip_rbracket->interval.end;
    +
    3847 ipv4_host->invalidate();
    +
    3848 dns_host->invalidate();
    +
    3849 }
    +
    3850 else if (dns_host->match(text, m_at->interval.end, end, flags)) {
    +
    3851 // Host is hostname
    +
    3852 this->interval.end = dns_host->interval.end;
    +
    3853 ipv4_host->invalidate();
    +
    3854 ipv6_host->invalidate();
    +
    3855 }
    +
    3856 else
    +
    3857 goto error;
    +
    3858 this->interval.start = start;
    +
    3859 return true;
    +
    3860 }
    +
    3861
    +
    3862 error:
    +
    3863 invalidate();
    +
    3864 return false;
    +
    3865 }
    +
    3866
    +
    3867 std::shared_ptr<basic_parser<T>> m_at;
    +
    3868 std::shared_ptr<basic_parser<T>> m_ip_lbracket;
    +
    3869 std::shared_ptr<basic_parser<T>> m_ip_rbracket;
    +
    3870 };
    -
    3870
    - - -
    3873#ifdef _UNICODE
    - -
    3875#else
    - -
    3877#endif
    - -
    3879
    -
    3883 template <class T>
    -
    - -
    3885 {
    -
    3886 public:
    - -
    3888 _In_ const std::shared_ptr<basic_parser<T>>& _emoticon,
    -
    3889 _In_ const std::shared_ptr<basic_parser<T>>& _apex,
    -
    3890 _In_ const std::shared_ptr<basic_parser<T>>& _eyes,
    -
    3891 _In_ const std::shared_ptr<basic_parser<T>>& _nose,
    -
    3892 _In_ const std::shared_ptr<basic_set<T>>& _mouth,
    -
    3893 _In_ const std::locale& locale = std::locale()) :
    - - -
    3896 apex(_apex),
    -
    3897 eyes(_eyes),
    -
    3898 nose(_nose),
    -
    3899 mouth(_mouth)
    -
    3900 {}
    -
    3901
    -
    3902 virtual void invalidate()
    -
    3903 {
    -
    3904 if (emoticon) emoticon->invalidate();
    -
    3905 if (apex) apex->invalidate();
    -
    3906 eyes->invalidate();
    -
    3907 if (nose) nose->invalidate();
    -
    3908 mouth->invalidate();
    - -
    3910 }
    -
    3911
    -
    3912 std::shared_ptr<basic_parser<T>> emoticon;
    -
    3913 std::shared_ptr<basic_parser<T>> apex;
    -
    3914 std::shared_ptr<basic_parser<T>> eyes;
    -
    3915 std::shared_ptr<basic_parser<T>> nose;
    -
    3916 std::shared_ptr<basic_set<T>> mouth;
    -
    3917
    -
    3918 protected:
    -
    3919 virtual bool do_match(
    -
    3920 _In_reads_or_z_opt_(end) const T* text,
    -
    3921 _In_ size_t start = 0,
    -
    3922 _In_ size_t end = SIZE_MAX,
    -
    3923 _In_ int flags = match_default)
    -
    3924 {
    -
    3925 _Assume_(text || start >= end);
    -
    3926
    -
    3927 if (emoticon && emoticon->match(text, start, end, flags)) {
    -
    3928 if (apex) apex->invalidate();
    -
    3929 eyes->invalidate();
    -
    3930 if (nose) nose->invalidate();
    -
    3931 mouth->invalidate();
    -
    3932 this->interval.start = start;
    -
    3933 this->interval.end = emoticon->interval.end;
    -
    3934 return true;
    -
    3935 }
    -
    3936
    -
    3937 this->interval.end = start;
    -
    3938
    -
    3939 if (apex && apex->match(text, this->interval.end, end, flags))
    -
    3940 this->interval.end = apex->interval.end;
    -
    3941
    -
    3942 if (eyes->match(text, this->interval.end, end, flags)) {
    -
    3943 if (nose && nose->match(text, eyes->interval.end, end, flags) &&
    -
    3944 mouth->match(text, nose->interval.end, end, flags))
    -
    3945 {
    -
    3946 size_t
    - -
    3948 hit_offset = mouth->hit_offset;
    -
    3949 // Mouth may repeat :-)))))))
    -
    3950 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
    -
    3951 mouth->interval.start = start_mouth;
    -
    3952 mouth->interval.end = this->interval.end;
    -
    3953 this->interval.start = start;
    -
    3954 return true;
    -
    3955 }
    -
    3956 if (mouth->match(text, eyes->interval.end, end, flags)) {
    -
    3957 size_t
    - -
    3959 hit_offset = mouth->hit_offset;
    -
    3960 // Mouth may repeat :-)))))))
    -
    3961 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
    -
    3962 if (nose) nose->invalidate();
    -
    3963 mouth->interval.start = start_mouth;
    -
    3964 mouth->interval.end = this->interval.end;
    -
    3965 this->interval.start = start;
    -
    3966 return true;
    -
    3967 }
    -
    3968 }
    -
    3969
    -
    3970 if (emoticon) emoticon->invalidate();
    -
    3971 if (apex) apex->invalidate();
    -
    3972 eyes->invalidate();
    -
    3973 if (nose) nose->invalidate();
    -
    3974 mouth->invalidate();
    -
    3975 this->interval.invalidate();
    -
    3976 return false;
    -
    3977 }
    -
    3978 };
    +
    3871
    + + +
    3874#ifdef _UNICODE
    + +
    3876#else
    + +
    3878#endif
    + +
    3880
    +
    3884 template <class T>
    +
    + +
    3886 {
    +
    3887 public:
    + +
    3889 _In_ const std::shared_ptr<basic_parser<T>>& _emoticon,
    +
    3890 _In_ const std::shared_ptr<basic_parser<T>>& _apex,
    +
    3891 _In_ const std::shared_ptr<basic_parser<T>>& _eyes,
    +
    3892 _In_ const std::shared_ptr<basic_parser<T>>& _nose,
    +
    3893 _In_ const std::shared_ptr<basic_set<T>>& _mouth,
    +
    3894 _In_ const std::locale& locale = std::locale()) :
    + + +
    3897 apex(_apex),
    +
    3898 eyes(_eyes),
    +
    3899 nose(_nose),
    +
    3900 mouth(_mouth)
    +
    3901 {}
    +
    3902
    +
    3903 virtual void invalidate()
    +
    3904 {
    +
    3905 if (emoticon) emoticon->invalidate();
    +
    3906 if (apex) apex->invalidate();
    +
    3907 eyes->invalidate();
    +
    3908 if (nose) nose->invalidate();
    +
    3909 mouth->invalidate();
    + +
    3911 }
    +
    3912
    +
    3913 std::shared_ptr<basic_parser<T>> emoticon;
    +
    3914 std::shared_ptr<basic_parser<T>> apex;
    +
    3915 std::shared_ptr<basic_parser<T>> eyes;
    +
    3916 std::shared_ptr<basic_parser<T>> nose;
    +
    3917 std::shared_ptr<basic_set<T>> mouth;
    +
    3918
    +
    3919 protected:
    +
    3920 virtual bool do_match(
    +
    3921 _In_reads_or_z_opt_(end) const T* text,
    +
    3922 _In_ size_t start = 0,
    +
    3923 _In_ size_t end = SIZE_MAX,
    +
    3924 _In_ int flags = match_default)
    +
    3925 {
    +
    3926 _Assume_(text || start >= end);
    +
    3927
    +
    3928 if (emoticon && emoticon->match(text, start, end, flags)) {
    +
    3929 if (apex) apex->invalidate();
    +
    3930 eyes->invalidate();
    +
    3931 if (nose) nose->invalidate();
    +
    3932 mouth->invalidate();
    +
    3933 this->interval.start = start;
    +
    3934 this->interval.end = emoticon->interval.end;
    +
    3935 return true;
    +
    3936 }
    +
    3937
    +
    3938 this->interval.end = start;
    +
    3939
    +
    3940 if (apex && apex->match(text, this->interval.end, end, flags))
    +
    3941 this->interval.end = apex->interval.end;
    +
    3942
    +
    3943 if (eyes->match(text, this->interval.end, end, flags)) {
    +
    3944 if (nose && nose->match(text, eyes->interval.end, end, flags) &&
    +
    3945 mouth->match(text, nose->interval.end, end, flags))
    +
    3946 {
    +
    3947 size_t
    + +
    3949 hit_offset = mouth->hit_offset;
    +
    3950 // Mouth may repeat :-)))))))
    +
    3951 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
    +
    3952 mouth->interval.start = start_mouth;
    +
    3953 mouth->interval.end = this->interval.end;
    +
    3954 this->interval.start = start;
    +
    3955 return true;
    +
    3956 }
    +
    3957 if (mouth->match(text, eyes->interval.end, end, flags)) {
    +
    3958 size_t
    + +
    3960 hit_offset = mouth->hit_offset;
    +
    3961 // Mouth may repeat :-)))))))
    +
    3962 for (this->interval.end = mouth->interval.end; mouth->match(text, this->interval.end, end, flags) && mouth->hit_offset == hit_offset; this->interval.end = mouth->interval.end);
    +
    3963 if (nose) nose->invalidate();
    +
    3964 mouth->interval.start = start_mouth;
    +
    3965 mouth->interval.end = this->interval.end;
    +
    3966 this->interval.start = start;
    +
    3967 return true;
    +
    3968 }
    +
    3969 }
    +
    3970
    +
    3971 if (emoticon) emoticon->invalidate();
    +
    3972 if (apex) apex->invalidate();
    +
    3973 eyes->invalidate();
    +
    3974 if (nose) nose->invalidate();
    +
    3975 mouth->invalidate();
    +
    3976 this->interval.invalidate();
    +
    3977 return false;
    +
    3978 }
    +
    3979 };
    -
    3979
    -
    3980 using emoticon = basic_emoticon<char>;
    -
    3981 using wemoticon = basic_emoticon<wchar_t>;
    -
    3982#ifdef _UNICODE
    -
    3983 using temoticon = wemoticon;
    -
    3984#else
    -
    3985 using temoticon = emoticon;
    -
    3986#endif
    -
    3987 using sgml_emoticon = basic_emoticon<char>;
    -
    3988
    -
    3992 enum date_format_t {
    -
    3993 date_format_none = 0,
    -
    3994 date_format_dmy = 0x1,
    -
    3995 date_format_mdy = 0x2,
    -
    3996 date_format_ymd = 0x4,
    -
    3997 date_format_ym = 0x8,
    -
    3998 date_format_my = 0x10,
    -
    3999 date_format_dm = 0x20,
    -
    4000 date_format_md = 0x40,
    -
    4001 };
    -
    4002
    -
    4006 template <class T>
    -
    -
    4007 class basic_date : public basic_parser<T>
    -
    4008 {
    -
    4009 public:
    -
    4010 basic_date(
    -
    4011 _In_ int format_mask,
    -
    4012 _In_ const std::shared_ptr<basic_integer<T>>& _day,
    -
    4013 _In_ const std::shared_ptr<basic_integer<T>>& _month,
    -
    4014 _In_ const std::shared_ptr<basic_integer<T>>& _year,
    -
    4015 _In_ const std::shared_ptr<basic_set<T>>& separator,
    -
    4016 _In_ const std::shared_ptr<basic_parser<T>>& space,
    -
    4017 _In_ const std::locale& locale = std::locale()) :
    - -
    4019 format(date_format_none),
    -
    4020 m_format_mask(format_mask),
    -
    4021 day(_day),
    -
    4022 month(_month),
    -
    4023 year(_year),
    -
    4024 m_separator(separator),
    -
    4025 m_space(space)
    -
    4026 {}
    -
    4027
    -
    4028 virtual void invalidate()
    -
    4029 {
    -
    4030 if (day) day->invalidate();
    -
    4031 if (month) month->invalidate();
    -
    4032 if (year) year->invalidate();
    -
    4033 format = date_format_none;
    - -
    4035 }
    -
    4036
    -
    4037 date_format_t format;
    -
    4038 std::shared_ptr<basic_integer<T>> day;
    -
    4039 std::shared_ptr<basic_integer<T>> month;
    -
    4040 std::shared_ptr<basic_integer<T>> year;
    -
    4041
    -
    4042 protected:
    -
    4043 virtual bool do_match(
    -
    4044 _In_reads_or_z_opt_(end) const T* text,
    -
    4045 _In_ size_t start = 0,
    -
    4046 _In_ size_t end = SIZE_MAX,
    -
    4047 _In_ int flags = match_default)
    -
    4048 {
    -
    4049 _Assume_(text || start >= end);
    -
    4050
    -
    4051 const int space_match_flags = flags & ~match_multiline; // Spaces in dates must never be broken in new line.
    -
    4052 if ((m_format_mask & date_format_dmy) == date_format_dmy) {
    -
    4053 if (day->match(text, start, end, flags)) {
    -
    4054 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4055 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4056 size_t hit_offset = m_separator->hit_offset;
    -
    4057 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4058 if (month->match(text, this->interval.end, end, flags)) {
    -
    4059 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4060 if (m_separator->match(text, this->interval.end, end, flags) &&
    -
    4061 m_separator->hit_offset == hit_offset) // Both separators must match.
    -
    4062 {
    -
    4063 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4064 if (year->match(text, this->interval.end, end, flags) &&
    -
    4065 is_valid(day->value, month->value))
    -
    4066 {
    -
    4067 this->interval.start = start;
    -
    4068 this->interval.end = year->interval.end;
    -
    4069 format = date_format_dmy;
    -
    4070 return true;
    -
    4071 }
    -
    4072 }
    -
    4073 }
    -
    4074 }
    -
    4075 }
    -
    4076 }
    -
    4077
    -
    4078 if ((m_format_mask & date_format_mdy) == date_format_mdy) {
    -
    4079 if (month->match(text, start, end, flags)) {
    -
    4080 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4081 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4082 size_t hit_offset = m_separator->hit_offset;
    -
    4083 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4084 if (day->match(text, this->interval.end, end, flags)) {
    -
    4085 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4086 if (m_separator->match(text, this->interval.end, end, flags) &&
    -
    4087 m_separator->hit_offset == hit_offset) // Both separators must match.
    -
    4088 {
    -
    4089 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4090 if (year->match(text, this->interval.end, end, flags) &&
    -
    4091 is_valid(day->value, month->value))
    -
    4092 {
    -
    4093 this->interval.start = start;
    -
    4094 this->interval.end = year->interval.end;
    -
    4095 format = date_format_mdy;
    -
    4096 return true;
    -
    4097 }
    -
    4098 }
    -
    4099 }
    -
    4100 }
    -
    4101 }
    -
    4102 }
    -
    4103
    -
    4104 if ((m_format_mask & date_format_ymd) == date_format_ymd) {
    -
    4105 if (year->match(text, start, end, flags)) {
    -
    4106 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4107 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4108 size_t hit_offset = m_separator->hit_offset;
    -
    4109 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4110 if (month->match(text, this->interval.end, end, flags)) {
    -
    4111 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4112 if (m_separator->match(text, this->interval.end, end, flags) &&
    -
    4113 m_separator->hit_offset == hit_offset) // Both separators must match.
    -
    4114 {
    -
    4115 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4116 if (day->match(text, this->interval.end, end, flags) &&
    -
    4117 is_valid(day->value, month->value))
    -
    4118 {
    -
    4119 this->interval.start = start;
    -
    4120 this->interval.end = day->interval.end;
    -
    4121 format = date_format_ymd;
    -
    4122 return true;
    -
    4123 }
    -
    4124 }
    -
    4125 }
    -
    4126 }
    -
    4127 }
    -
    4128 }
    -
    4129
    -
    4130 if ((m_format_mask & date_format_ym) == date_format_ym) {
    -
    4131 if (year->match(text, start, end, flags)) {
    -
    4132 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4133 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4134 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4135 if (month->match(text, this->interval.end, end, flags) &&
    -
    4136 is_valid(SIZE_MAX, month->value))
    -
    4137 {
    -
    4138 if (day) day->invalidate();
    -
    4139 this->interval.start = start;
    -
    4140 this->interval.end = month->interval.end;
    -
    4141 format = date_format_ym;
    -
    4142 return true;
    -
    4143 }
    -
    4144 }
    -
    4145 }
    -
    4146 }
    -
    4147
    -
    4148 if ((m_format_mask & date_format_my) == date_format_my) {
    -
    4149 if (month->match(text, start, end, flags)) {
    -
    4150 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4151 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4152 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4153 if (year->match(text, this->interval.end, end, flags) &&
    -
    4154 is_valid(SIZE_MAX, month->value))
    -
    4155 {
    -
    4156 if (day) day->invalidate();
    -
    4157 this->interval.start = start;
    -
    4158 this->interval.end = year->interval.end;
    -
    4159 format = date_format_my;
    -
    4160 return true;
    -
    4161 }
    -
    4162 }
    -
    4163 }
    -
    4164 }
    -
    4165
    -
    4166 if ((m_format_mask & date_format_dm) == date_format_dm) {
    -
    4167 if (day->match(text, start, end, flags)) {
    -
    4168 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4169 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4170 size_t hit_offset = m_separator->hit_offset;
    -
    4171 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4172 if (month->match(text, this->interval.end, end, flags) &&
    -
    4173 is_valid(day->value, month->value))
    -
    4174 {
    -
    4175 if (year) year->invalidate();
    -
    4176 this->interval.start = start;
    -
    4177 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4178 if (m_separator->match(text, this->interval.end, end, flags) &&
    -
    4179 m_separator->hit_offset == hit_offset) // Both separators must match.
    -
    4180 this->interval.end = m_separator->interval.end;
    -
    4181 else
    -
    4182 this->interval.end = month->interval.end;
    -
    4183 format = date_format_dm;
    -
    4184 return true;
    -
    4185 }
    -
    4186 }
    -
    4187 }
    -
    4188 }
    -
    4189
    -
    4190 if ((m_format_mask & date_format_md) == date_format_md) {
    -
    4191 if (month->match(text, start, end, flags)) {
    -
    4192 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4193 if (m_separator->match(text, this->interval.end, end, flags)) {
    -
    4194 size_t hit_offset = m_separator->hit_offset;
    -
    4195 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4196 if (day->match(text, this->interval.end, end, flags) &&
    -
    4197 is_valid(day->value, month->value))
    -
    4198 {
    -
    4199 if (year) year->invalidate();
    -
    4200 this->interval.start = start;
    -
    4201 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    -
    4202 if (m_separator->match(text, this->interval.end, end, flags) &&
    -
    4203 m_separator->hit_offset == hit_offset) // Both separators must match.
    -
    4204 this->interval.end = m_separator->interval.end;
    -
    4205 else
    -
    4206 this->interval.end = day->interval.end;
    -
    4207 format = date_format_md;
    -
    4208 return true;
    -
    4209 }
    -
    4210 }
    -
    4211 }
    -
    4212 }
    -
    4213
    -
    4214 if (day) day->invalidate();
    -
    4215 if (month) month->invalidate();
    -
    4216 if (year) year->invalidate();
    -
    4217 format = date_format_none;
    -
    4218 this->interval.invalidate();
    -
    4219 return false;
    -
    4220 }
    -
    4221
    -
    4222 static bool is_valid(size_t day, size_t month)
    -
    4223 {
    -
    4224 if (month == SIZE_MAX) {
    -
    4225 // Default to January. This allows validating day only, as January has all 31 days.
    -
    4226 month = 1;
    -
    4227 }
    -
    4228 if (day == SIZE_MAX) {
    -
    4229 // Default to 1st day in month. This allows validating month only, as each month has 1st day.
    -
    4230 day = 1;
    -
    4231 }
    -
    4232
    -
    4233 switch (month) {
    -
    4234 case 1:
    -
    4235 case 3:
    -
    4236 case 5:
    -
    4237 case 7:
    -
    4238 case 8:
    -
    4239 case 10:
    -
    4240 case 12:
    -
    4241 return 1 <= day && day <= 31;
    -
    4242 case 2:
    -
    4243 return 1 <= day && day <= 29;
    -
    4244 case 4:
    -
    4245 case 6:
    -
    4246 case 9:
    -
    4247 case 11:
    -
    4248 return 1 <= day && day <= 30;
    -
    4249 default:
    -
    4250 return false;
    -
    4251 }
    -
    4252 }
    -
    4253
    -
    4254 int m_format_mask;
    -
    4255 std::shared_ptr<basic_set<T>> m_separator;
    -
    4256 std::shared_ptr<basic_parser<T>> m_space;
    -
    4257 };
    +
    3980
    +
    3981 using emoticon = basic_emoticon<char>;
    +
    3982 using wemoticon = basic_emoticon<wchar_t>;
    +
    3983#ifdef _UNICODE
    +
    3984 using temoticon = wemoticon;
    +
    3985#else
    +
    3986 using temoticon = emoticon;
    +
    3987#endif
    +
    3988 using sgml_emoticon = basic_emoticon<char>;
    +
    3989
    +
    3993 enum date_format_t {
    +
    3994 date_format_none = 0,
    +
    3995 date_format_dmy = 0x1,
    +
    3996 date_format_mdy = 0x2,
    +
    3997 date_format_ymd = 0x4,
    +
    3998 date_format_ym = 0x8,
    +
    3999 date_format_my = 0x10,
    +
    4000 date_format_dm = 0x20,
    +
    4001 date_format_md = 0x40,
    +
    4002 };
    +
    4003
    +
    4007 template <class T>
    +
    +
    4008 class basic_date : public basic_parser<T>
    +
    4009 {
    +
    4010 public:
    +
    4011 basic_date(
    +
    4012 _In_ int format_mask,
    +
    4013 _In_ const std::shared_ptr<basic_integer<T>>& _day,
    +
    4014 _In_ const std::shared_ptr<basic_integer<T>>& _month,
    +
    4015 _In_ const std::shared_ptr<basic_integer<T>>& _year,
    +
    4016 _In_ const std::shared_ptr<basic_set<T>>& separator,
    +
    4017 _In_ const std::shared_ptr<basic_parser<T>>& space,
    +
    4018 _In_ const std::locale& locale = std::locale()) :
    + +
    4020 format(date_format_none),
    +
    4021 m_format_mask(format_mask),
    +
    4022 day(_day),
    +
    4023 month(_month),
    +
    4024 year(_year),
    +
    4025 m_separator(separator),
    +
    4026 m_space(space)
    +
    4027 {}
    +
    4028
    +
    4029 virtual void invalidate()
    +
    4030 {
    +
    4031 if (day) day->invalidate();
    +
    4032 if (month) month->invalidate();
    +
    4033 if (year) year->invalidate();
    +
    4034 format = date_format_none;
    + +
    4036 }
    +
    4037
    +
    4038 date_format_t format;
    +
    4039 std::shared_ptr<basic_integer<T>> day;
    +
    4040 std::shared_ptr<basic_integer<T>> month;
    +
    4041 std::shared_ptr<basic_integer<T>> year;
    +
    4042
    +
    4043 protected:
    +
    4044 virtual bool do_match(
    +
    4045 _In_reads_or_z_opt_(end) const T* text,
    +
    4046 _In_ size_t start = 0,
    +
    4047 _In_ size_t end = SIZE_MAX,
    +
    4048 _In_ int flags = match_default)
    +
    4049 {
    +
    4050 _Assume_(text || start >= end);
    +
    4051
    +
    4052 const int space_match_flags = flags & ~match_multiline; // Spaces in dates must never be broken in new line.
    +
    4053 if ((m_format_mask & date_format_dmy) == date_format_dmy) {
    +
    4054 if (day->match(text, start, end, flags)) {
    +
    4055 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4056 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4057 size_t hit_offset = m_separator->hit_offset;
    +
    4058 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4059 if (month->match(text, this->interval.end, end, flags)) {
    +
    4060 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4061 if (m_separator->match(text, this->interval.end, end, flags) &&
    +
    4062 m_separator->hit_offset == hit_offset) // Both separators must match.
    +
    4063 {
    +
    4064 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4065 if (year->match(text, this->interval.end, end, flags) &&
    +
    4066 is_valid(day->value, month->value))
    +
    4067 {
    +
    4068 this->interval.start = start;
    +
    4069 this->interval.end = year->interval.end;
    +
    4070 format = date_format_dmy;
    +
    4071 return true;
    +
    4072 }
    +
    4073 }
    +
    4074 }
    +
    4075 }
    +
    4076 }
    +
    4077 }
    +
    4078
    +
    4079 if ((m_format_mask & date_format_mdy) == date_format_mdy) {
    +
    4080 if (month->match(text, start, end, flags)) {
    +
    4081 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4082 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4083 size_t hit_offset = m_separator->hit_offset;
    +
    4084 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4085 if (day->match(text, this->interval.end, end, flags)) {
    +
    4086 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4087 if (m_separator->match(text, this->interval.end, end, flags) &&
    +
    4088 m_separator->hit_offset == hit_offset) // Both separators must match.
    +
    4089 {
    +
    4090 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4091 if (year->match(text, this->interval.end, end, flags) &&
    +
    4092 is_valid(day->value, month->value))
    +
    4093 {
    +
    4094 this->interval.start = start;
    +
    4095 this->interval.end = year->interval.end;
    +
    4096 format = date_format_mdy;
    +
    4097 return true;
    +
    4098 }
    +
    4099 }
    +
    4100 }
    +
    4101 }
    +
    4102 }
    +
    4103 }
    +
    4104
    +
    4105 if ((m_format_mask & date_format_ymd) == date_format_ymd) {
    +
    4106 if (year->match(text, start, end, flags)) {
    +
    4107 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4108 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4109 size_t hit_offset = m_separator->hit_offset;
    +
    4110 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4111 if (month->match(text, this->interval.end, end, flags)) {
    +
    4112 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4113 if (m_separator->match(text, this->interval.end, end, flags) &&
    +
    4114 m_separator->hit_offset == hit_offset) // Both separators must match.
    +
    4115 {
    +
    4116 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4117 if (day->match(text, this->interval.end, end, flags) &&
    +
    4118 is_valid(day->value, month->value))
    +
    4119 {
    +
    4120 this->interval.start = start;
    +
    4121 this->interval.end = day->interval.end;
    +
    4122 format = date_format_ymd;
    +
    4123 return true;
    +
    4124 }
    +
    4125 }
    +
    4126 }
    +
    4127 }
    +
    4128 }
    +
    4129 }
    +
    4130
    +
    4131 if ((m_format_mask & date_format_ym) == date_format_ym) {
    +
    4132 if (year->match(text, start, end, flags)) {
    +
    4133 for (this->interval.end = year->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4134 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4135 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4136 if (month->match(text, this->interval.end, end, flags) &&
    +
    4137 is_valid(SIZE_MAX, month->value))
    +
    4138 {
    +
    4139 if (day) day->invalidate();
    +
    4140 this->interval.start = start;
    +
    4141 this->interval.end = month->interval.end;
    +
    4142 format = date_format_ym;
    +
    4143 return true;
    +
    4144 }
    +
    4145 }
    +
    4146 }
    +
    4147 }
    +
    4148
    +
    4149 if ((m_format_mask & date_format_my) == date_format_my) {
    +
    4150 if (month->match(text, start, end, flags)) {
    +
    4151 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4152 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4153 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4154 if (year->match(text, this->interval.end, end, flags) &&
    +
    4155 is_valid(SIZE_MAX, month->value))
    +
    4156 {
    +
    4157 if (day) day->invalidate();
    +
    4158 this->interval.start = start;
    +
    4159 this->interval.end = year->interval.end;
    +
    4160 format = date_format_my;
    +
    4161 return true;
    +
    4162 }
    +
    4163 }
    +
    4164 }
    +
    4165 }
    +
    4166
    +
    4167 if ((m_format_mask & date_format_dm) == date_format_dm) {
    +
    4168 if (day->match(text, start, end, flags)) {
    +
    4169 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4170 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4171 size_t hit_offset = m_separator->hit_offset;
    +
    4172 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4173 if (month->match(text, this->interval.end, end, flags) &&
    +
    4174 is_valid(day->value, month->value))
    +
    4175 {
    +
    4176 if (year) year->invalidate();
    +
    4177 this->interval.start = start;
    +
    4178 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4179 if (m_separator->match(text, this->interval.end, end, flags) &&
    +
    4180 m_separator->hit_offset == hit_offset) // Both separators must match.
    +
    4181 this->interval.end = m_separator->interval.end;
    +
    4182 else
    +
    4183 this->interval.end = month->interval.end;
    +
    4184 format = date_format_dm;
    +
    4185 return true;
    +
    4186 }
    +
    4187 }
    +
    4188 }
    +
    4189 }
    +
    4190
    +
    4191 if ((m_format_mask & date_format_md) == date_format_md) {
    +
    4192 if (month->match(text, start, end, flags)) {
    +
    4193 for (this->interval.end = month->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4194 if (m_separator->match(text, this->interval.end, end, flags)) {
    +
    4195 size_t hit_offset = m_separator->hit_offset;
    +
    4196 for (this->interval.end = m_separator->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4197 if (day->match(text, this->interval.end, end, flags) &&
    +
    4198 is_valid(day->value, month->value))
    +
    4199 {
    +
    4200 if (year) year->invalidate();
    +
    4201 this->interval.start = start;
    +
    4202 for (this->interval.end = day->interval.end; m_space->match(text, this->interval.end, end, space_match_flags); this->interval.end = m_space->interval.end);
    +
    4203 if (m_separator->match(text, this->interval.end, end, flags) &&
    +
    4204 m_separator->hit_offset == hit_offset) // Both separators must match.
    +
    4205 this->interval.end = m_separator->interval.end;
    +
    4206 else
    +
    4207 this->interval.end = day->interval.end;
    +
    4208 format = date_format_md;
    +
    4209 return true;
    +
    4210 }
    +
    4211 }
    +
    4212 }
    +
    4213 }
    +
    4214
    +
    4215 if (day) day->invalidate();
    +
    4216 if (month) month->invalidate();
    +
    4217 if (year) year->invalidate();
    +
    4218 format = date_format_none;
    +
    4219 this->interval.invalidate();
    +
    4220 return false;
    +
    4221 }
    +
    4222
    +
    4223 static bool is_valid(size_t day, size_t month)
    +
    4224 {
    +
    4225 if (month == SIZE_MAX) {
    +
    4226 // Default to January. This allows validating day only, as January has all 31 days.
    +
    4227 month = 1;
    +
    4228 }
    +
    4229 if (day == SIZE_MAX) {
    +
    4230 // Default to 1st day in month. This allows validating month only, as each month has 1st day.
    +
    4231 day = 1;
    +
    4232 }
    +
    4233
    +
    4234 switch (month) {
    +
    4235 case 1:
    +
    4236 case 3:
    +
    4237 case 5:
    +
    4238 case 7:
    +
    4239 case 8:
    +
    4240 case 10:
    +
    4241 case 12:
    +
    4242 return 1 <= day && day <= 31;
    +
    4243 case 2:
    +
    4244 return 1 <= day && day <= 29;
    +
    4245 case 4:
    +
    4246 case 6:
    +
    4247 case 9:
    +
    4248 case 11:
    +
    4249 return 1 <= day && day <= 30;
    +
    4250 default:
    +
    4251 return false;
    +
    4252 }
    +
    4253 }
    +
    4254
    +
    4255 int m_format_mask;
    +
    4256 std::shared_ptr<basic_set<T>> m_separator;
    +
    4257 std::shared_ptr<basic_parser<T>> m_space;
    +
    4258 };
    -
    4258
    -
    4259 using date = basic_date<char>;
    -
    4260 using wdate = basic_date<wchar_t>;
    -
    4261#ifdef _UNICODE
    -
    4262 using tdate = wdate;
    -
    4263#else
    -
    4264 using tdate = date;
    -
    4265#endif
    - -
    4267
    -
    4271 template <class T>
    -
    -
    4272 class basic_time : public basic_parser<T>
    -
    4273 {
    -
    4274 public:
    -
    4275 basic_time(
    -
    4276 _In_ const std::shared_ptr<basic_integer10<T>>& _hour,
    -
    4277 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
    -
    4278 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
    -
    4279 _In_ const std::shared_ptr<basic_integer10<T>>& _millisecond,
    -
    4280 _In_ const std::shared_ptr<basic_set<T>>& separator,
    -
    4281 _In_ const std::shared_ptr<basic_parser<T>>& millisecond_separator,
    -
    4282 _In_ const std::locale& locale = std::locale()) :
    - -
    4284 hour(_hour),
    -
    4285 minute(_minute),
    -
    4286 second(_second),
    -
    4287 millisecond(_millisecond),
    -
    4288 m_separator(separator),
    -
    4289 m_millisecond_separator(millisecond_separator)
    -
    4290 {}
    -
    4291
    -
    4292 virtual void invalidate()
    -
    4293 {
    -
    4294 hour->invalidate();
    -
    4295 minute->invalidate();
    -
    4296 if (second) second->invalidate();
    -
    4297 if (millisecond) millisecond->invalidate();
    - -
    4299 }
    -
    4300
    -
    4301 std::shared_ptr<basic_integer10<T>> hour;
    -
    4302 std::shared_ptr<basic_integer10<T>> minute;
    -
    4303 std::shared_ptr<basic_integer10<T>> second;
    -
    4304 std::shared_ptr<basic_integer10<T>> millisecond;
    -
    4305
    -
    4306 protected:
    -
    4307 virtual bool do_match(
    -
    4308 _In_reads_or_z_opt_(end) const T* text,
    -
    4309 _In_ size_t start = 0,
    -
    4310 _In_ size_t end = SIZE_MAX,
    -
    4311 _In_ int flags = match_default)
    -
    4312 {
    -
    4313 _Assume_(text || start >= end);
    -
    4314
    -
    4315 if (hour->match(text, start, end, flags) &&
    -
    4316 m_separator->match(text, hour->interval.end, end, flags) &&
    -
    4317 minute->match(text, m_separator->interval.end, end, flags) &&
    -
    4318 minute->value < 60)
    -
    4319 {
    -
    4320 // hh::mm
    -
    4321 size_t hit_offset = m_separator->hit_offset;
    -
    4322 if (m_separator->match(text, minute->interval.end, end, flags) &&
    -
    4323 m_separator->hit_offset == hit_offset && // Both separators must match.
    -
    4324 second && second->match(text, m_separator->interval.end, end, flags) &&
    -
    4325 second->value < 60)
    -
    4326 {
    -
    4327 // hh::mm:ss
    -
    4328 if (m_millisecond_separator && m_millisecond_separator->match(text, second->interval.end, end, flags) &&
    -
    4329 millisecond && millisecond->match(text, m_millisecond_separator->interval.end, end, flags) &&
    -
    4330 millisecond->value < 1000)
    -
    4331 {
    -
    4332 // hh::mm:ss.mmmm
    -
    4333 this->interval.end = millisecond->interval.end;
    -
    4334 }
    -
    4335 else {
    -
    4336 if (millisecond) millisecond->invalidate();
    -
    4337 this->interval.end = second->interval.end;
    -
    4338 }
    -
    4339 }
    -
    4340 else {
    -
    4341 if (second) second->invalidate();
    -
    4342 if (millisecond) millisecond->invalidate();
    -
    4343 this->interval.end = minute->interval.end;
    -
    4344 }
    -
    4345 this->interval.start = start;
    -
    4346 return true;
    -
    4347 }
    -
    4348
    -
    4349 hour->invalidate();
    -
    4350 minute->invalidate();
    -
    4351 if (second) second->invalidate();
    -
    4352 if (millisecond) millisecond->invalidate();
    -
    4353 this->interval.invalidate();
    -
    4354 return false;
    -
    4355 }
    -
    4356
    -
    4357 std::shared_ptr<basic_set<T>> m_separator;
    -
    4358 std::shared_ptr<basic_parser<T>> m_millisecond_separator;
    -
    4359 };
    +
    4259
    +
    4260 using date = basic_date<char>;
    +
    4261 using wdate = basic_date<wchar_t>;
    +
    4262#ifdef _UNICODE
    +
    4263 using tdate = wdate;
    +
    4264#else
    +
    4265 using tdate = date;
    +
    4266#endif
    + +
    4268
    +
    4272 template <class T>
    +
    +
    4273 class basic_time : public basic_parser<T>
    +
    4274 {
    +
    4275 public:
    +
    4276 basic_time(
    +
    4277 _In_ const std::shared_ptr<basic_integer10<T>>& _hour,
    +
    4278 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
    +
    4279 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
    +
    4280 _In_ const std::shared_ptr<basic_integer10<T>>& _millisecond,
    +
    4281 _In_ const std::shared_ptr<basic_set<T>>& separator,
    +
    4282 _In_ const std::shared_ptr<basic_parser<T>>& millisecond_separator,
    +
    4283 _In_ const std::locale& locale = std::locale()) :
    + +
    4285 hour(_hour),
    +
    4286 minute(_minute),
    +
    4287 second(_second),
    +
    4288 millisecond(_millisecond),
    +
    4289 m_separator(separator),
    +
    4290 m_millisecond_separator(millisecond_separator)
    +
    4291 {}
    +
    4292
    +
    4293 virtual void invalidate()
    +
    4294 {
    +
    4295 hour->invalidate();
    +
    4296 minute->invalidate();
    +
    4297 if (second) second->invalidate();
    +
    4298 if (millisecond) millisecond->invalidate();
    + +
    4300 }
    +
    4301
    +
    4302 std::shared_ptr<basic_integer10<T>> hour;
    +
    4303 std::shared_ptr<basic_integer10<T>> minute;
    +
    4304 std::shared_ptr<basic_integer10<T>> second;
    +
    4305 std::shared_ptr<basic_integer10<T>> millisecond;
    +
    4306
    +
    4307 protected:
    +
    4308 virtual bool do_match(
    +
    4309 _In_reads_or_z_opt_(end) const T* text,
    +
    4310 _In_ size_t start = 0,
    +
    4311 _In_ size_t end = SIZE_MAX,
    +
    4312 _In_ int flags = match_default)
    +
    4313 {
    +
    4314 _Assume_(text || start >= end);
    +
    4315
    +
    4316 if (hour->match(text, start, end, flags) &&
    +
    4317 m_separator->match(text, hour->interval.end, end, flags) &&
    +
    4318 minute->match(text, m_separator->interval.end, end, flags) &&
    +
    4319 minute->value < 60)
    +
    4320 {
    +
    4321 // hh::mm
    +
    4322 size_t hit_offset = m_separator->hit_offset;
    +
    4323 if (m_separator->match(text, minute->interval.end, end, flags) &&
    +
    4324 m_separator->hit_offset == hit_offset && // Both separators must match.
    +
    4325 second && second->match(text, m_separator->interval.end, end, flags) &&
    +
    4326 second->value < 60)
    +
    4327 {
    +
    4328 // hh::mm:ss
    +
    4329 if (m_millisecond_separator && m_millisecond_separator->match(text, second->interval.end, end, flags) &&
    +
    4330 millisecond && millisecond->match(text, m_millisecond_separator->interval.end, end, flags) &&
    +
    4331 millisecond->value < 1000)
    +
    4332 {
    +
    4333 // hh::mm:ss.mmmm
    +
    4334 this->interval.end = millisecond->interval.end;
    +
    4335 }
    +
    4336 else {
    +
    4337 if (millisecond) millisecond->invalidate();
    +
    4338 this->interval.end = second->interval.end;
    +
    4339 }
    +
    4340 }
    +
    4341 else {
    +
    4342 if (second) second->invalidate();
    +
    4343 if (millisecond) millisecond->invalidate();
    +
    4344 this->interval.end = minute->interval.end;
    +
    4345 }
    +
    4346 this->interval.start = start;
    +
    4347 return true;
    +
    4348 }
    +
    4349
    +
    4350 hour->invalidate();
    +
    4351 minute->invalidate();
    +
    4352 if (second) second->invalidate();
    +
    4353 if (millisecond) millisecond->invalidate();
    +
    4354 this->interval.invalidate();
    +
    4355 return false;
    +
    4356 }
    +
    4357
    +
    4358 std::shared_ptr<basic_set<T>> m_separator;
    +
    4359 std::shared_ptr<basic_parser<T>> m_millisecond_separator;
    +
    4360 };
    -
    4360
    -
    4361 using time = basic_time<char>;
    -
    4362 using wtime = basic_time<wchar_t>;
    -
    4363#ifdef _UNICODE
    -
    4364 using ttime = wtime;
    -
    4365#else
    -
    4366 using ttime = time;
    -
    4367#endif
    - -
    4369
    -
    4373 template <class T>
    -
    -
    4374 class basic_angle : public basic_parser<T>
    -
    4375 {
    -
    4376 public:
    - -
    4378 _In_ const std::shared_ptr<basic_integer10<T>>& _degree,
    -
    4379 _In_ const std::shared_ptr<basic_parser<T>>& _degree_separator,
    -
    4380 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
    -
    4381 _In_ const std::shared_ptr<basic_parser<T>>& _minute_separator,
    -
    4382 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
    -
    4383 _In_ const std::shared_ptr<basic_parser<T>>& _second_separator,
    -
    4384 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
    -
    4385 _In_ const std::locale& locale = std::locale()) :
    - -
    4387 degree(_degree),
    -
    4388 degree_separator(_degree_separator),
    -
    4389 minute(_minute),
    -
    4390 minute_separator(_minute_separator),
    -
    4391 second(_second),
    -
    4392 second_separator(_second_separator),
    -
    4393 decimal(_decimal)
    -
    4394 {}
    -
    4395
    -
    4396 virtual void invalidate()
    -
    4397 {
    -
    4398 degree->invalidate();
    -
    4399 degree_separator->invalidate();
    -
    4400 minute->invalidate();
    -
    4401 minute_separator->invalidate();
    -
    4402 if (second) second->invalidate();
    -
    4403 if (second_separator) second_separator->invalidate();
    -
    4404 if (decimal) decimal->invalidate();
    - -
    4406 }
    -
    4407
    -
    4408 std::shared_ptr<basic_integer10<T>> degree;
    -
    4409 std::shared_ptr<basic_parser<T>> degree_separator;
    -
    4410 std::shared_ptr<basic_integer10<T>> minute;
    -
    4411 std::shared_ptr<basic_parser<T>> minute_separator;
    -
    4412 std::shared_ptr<basic_integer10<T>> second;
    -
    4413 std::shared_ptr<basic_parser<T>> second_separator;
    -
    4414 std::shared_ptr<basic_parser<T>> decimal;
    -
    4415
    -
    4416 protected:
    -
    4417 virtual bool do_match(
    -
    4418 _In_reads_or_z_opt_(end) const T* text,
    -
    4419 _In_ size_t start = 0,
    -
    4420 _In_ size_t end = SIZE_MAX,
    -
    4421 _In_ int flags = match_default)
    -
    4422 {
    -
    4423 _Assume_(text || start >= end);
    -
    4424
    -
    4425 this->interval.end = start;
    -
    4426
    -
    4427 if (degree->match(text, this->interval.end, end, flags) &&
    -
    4428 degree_separator->match(text, degree->interval.end, end, flags))
    -
    4429 {
    -
    4430 // Degrees
    -
    4431 this->interval.end = degree_separator->interval.end;
    -
    4432 }
    -
    4433 else {
    -
    4434 degree->invalidate();
    -
    4435 degree_separator->invalidate();
    -
    4436 }
    -
    4437
    -
    4438 if (minute->match(text, this->interval.end, end, flags) &&
    -
    4439 minute->value < 60 &&
    -
    4440 minute_separator->match(text, minute->interval.end, end, flags))
    -
    4441 {
    -
    4442 // Minutes
    -
    4443 this->interval.end = minute_separator->interval.end;
    -
    4444 }
    -
    4445 else {
    -
    4446 minute->invalidate();
    -
    4447 minute_separator->invalidate();
    -
    4448 }
    -
    4449
    -
    4450 if (second && second->match(text, this->interval.end, end, flags) &&
    -
    4451 second->value < 60)
    -
    4452 {
    -
    4453 // Seconds
    -
    4454 this->interval.end = second->interval.end;
    -
    4455 if (second_separator && second_separator->match(text, this->interval.end, end, flags))
    -
    4456 this->interval.end = second_separator->interval.end;
    -
    4457 else
    -
    4458 if (second_separator) second_separator->invalidate();
    -
    4459 }
    -
    4460 else {
    -
    4461 if (second) second->invalidate();
    -
    4462 if (second_separator) second_separator->invalidate();
    -
    4463 }
    -
    4464
    -
    4465 if (degree->interval.start < degree->interval.end ||
    -
    4466 minute->interval.start < minute->interval.end ||
    -
    4467 (second && second->interval.start < second->interval.end))
    -
    4468 {
    -
    4469 if (decimal && decimal->match(text, this->interval.end, end, flags)) {
    -
    4470 // Decimals
    -
    4471 this->interval.end = decimal->interval.end;
    -
    4472 }
    -
    4473 else if (decimal)
    -
    4474 decimal->invalidate();
    -
    4475 this->interval.start = start;
    -
    4476 return true;
    -
    4477 }
    -
    4478 if (decimal) decimal->invalidate();
    -
    4479 this->interval.invalidate();
    -
    4480 return false;
    -
    4481 }
    -
    4482 };
    +
    4361
    +
    4362 using time = basic_time<char>;
    +
    4363 using wtime = basic_time<wchar_t>;
    +
    4364#ifdef _UNICODE
    +
    4365 using ttime = wtime;
    +
    4366#else
    +
    4367 using ttime = time;
    +
    4368#endif
    + +
    4370
    +
    4374 template <class T>
    +
    +
    4375 class basic_angle : public basic_parser<T>
    +
    4376 {
    +
    4377 public:
    + +
    4379 _In_ const std::shared_ptr<basic_integer10<T>>& _degree,
    +
    4380 _In_ const std::shared_ptr<basic_parser<T>>& _degree_separator,
    +
    4381 _In_ const std::shared_ptr<basic_integer10<T>>& _minute,
    +
    4382 _In_ const std::shared_ptr<basic_parser<T>>& _minute_separator,
    +
    4383 _In_ const std::shared_ptr<basic_integer10<T>>& _second,
    +
    4384 _In_ const std::shared_ptr<basic_parser<T>>& _second_separator,
    +
    4385 _In_ const std::shared_ptr<basic_parser<T>>& _decimal,
    +
    4386 _In_ const std::locale& locale = std::locale()) :
    + +
    4388 degree(_degree),
    +
    4389 degree_separator(_degree_separator),
    +
    4390 minute(_minute),
    +
    4391 minute_separator(_minute_separator),
    +
    4392 second(_second),
    +
    4393 second_separator(_second_separator),
    +
    4394 decimal(_decimal)
    +
    4395 {}
    +
    4396
    +
    4397 virtual void invalidate()
    +
    4398 {
    +
    4399 degree->invalidate();
    +
    4400 degree_separator->invalidate();
    +
    4401 minute->invalidate();
    +
    4402 minute_separator->invalidate();
    +
    4403 if (second) second->invalidate();
    +
    4404 if (second_separator) second_separator->invalidate();
    +
    4405 if (decimal) decimal->invalidate();
    + +
    4407 }
    +
    4408
    +
    4409 std::shared_ptr<basic_integer10<T>> degree;
    +
    4410 std::shared_ptr<basic_parser<T>> degree_separator;
    +
    4411 std::shared_ptr<basic_integer10<T>> minute;
    +
    4412 std::shared_ptr<basic_parser<T>> minute_separator;
    +
    4413 std::shared_ptr<basic_integer10<T>> second;
    +
    4414 std::shared_ptr<basic_parser<T>> second_separator;
    +
    4415 std::shared_ptr<basic_parser<T>> decimal;
    +
    4416
    +
    4417 protected:
    +
    4418 virtual bool do_match(
    +
    4419 _In_reads_or_z_opt_(end) const T* text,
    +
    4420 _In_ size_t start = 0,
    +
    4421 _In_ size_t end = SIZE_MAX,
    +
    4422 _In_ int flags = match_default)
    +
    4423 {
    +
    4424 _Assume_(text || start >= end);
    +
    4425
    +
    4426 this->interval.end = start;
    +
    4427
    +
    4428 if (degree->match(text, this->interval.end, end, flags) &&
    +
    4429 degree_separator->match(text, degree->interval.end, end, flags))
    +
    4430 {
    +
    4431 // Degrees
    +
    4432 this->interval.end = degree_separator->interval.end;
    +
    4433 }
    +
    4434 else {
    +
    4435 degree->invalidate();
    +
    4436 degree_separator->invalidate();
    +
    4437 }
    +
    4438
    +
    4439 if (minute->match(text, this->interval.end, end, flags) &&
    +
    4440 minute->value < 60 &&
    +
    4441 minute_separator->match(text, minute->interval.end, end, flags))
    +
    4442 {
    +
    4443 // Minutes
    +
    4444 this->interval.end = minute_separator->interval.end;
    +
    4445 }
    +
    4446 else {
    +
    4447 minute->invalidate();
    +
    4448 minute_separator->invalidate();
    +
    4449 }
    +
    4450
    +
    4451 if (second && second->match(text, this->interval.end, end, flags) &&
    +
    4452 second->value < 60)
    +
    4453 {
    +
    4454 // Seconds
    +
    4455 this->interval.end = second->interval.end;
    +
    4456 if (second_separator && second_separator->match(text, this->interval.end, end, flags))
    +
    4457 this->interval.end = second_separator->interval.end;
    +
    4458 else
    +
    4459 if (second_separator) second_separator->invalidate();
    +
    4460 }
    +
    4461 else {
    +
    4462 if (second) second->invalidate();
    +
    4463 if (second_separator) second_separator->invalidate();
    +
    4464 }
    +
    4465
    +
    4466 if (degree->interval.start < degree->interval.end ||
    +
    4467 minute->interval.start < minute->interval.end ||
    +
    4468 (second && second->interval.start < second->interval.end))
    +
    4469 {
    +
    4470 if (decimal && decimal->match(text, this->interval.end, end, flags)) {
    +
    4471 // Decimals
    +
    4472 this->interval.end = decimal->interval.end;
    +
    4473 }
    +
    4474 else if (decimal)
    +
    4475 decimal->invalidate();
    +
    4476 this->interval.start = start;
    +
    4477 return true;
    +
    4478 }
    +
    4479 if (decimal) decimal->invalidate();
    +
    4480 this->interval.invalidate();
    +
    4481 return false;
    +
    4482 }
    +
    4483 };
    -
    4483
    -
    4484 using angle = basic_angle<char>;
    - -
    4486#ifdef _UNICODE
    -
    4487 using RRegElKot = wangle;
    -
    4488#else
    -
    4489 using RRegElKot = angle;
    -
    4490#endif
    - -
    4492
    -
    4496 template <class T>
    -
    - -
    4498 {
    -
    4499 public:
    - -
    4501 _In_ const std::shared_ptr<basic_parser<T>>& digit,
    -
    4502 _In_ const std::shared_ptr<basic_parser<T>>& plus_sign,
    -
    4503 _In_ const std::shared_ptr<basic_set<T>>& lparenthesis,
    -
    4504 _In_ const std::shared_ptr<basic_set<T>>& rparenthesis,
    -
    4505 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    -
    4506 _In_ const std::shared_ptr<basic_parser<T>>& space,
    -
    4507 _In_ const std::locale& locale = std::locale()) :
    - -
    4509 m_digit(digit),
    -
    4510 m_plus_sign(plus_sign),
    -
    4511 m_lparenthesis(lparenthesis),
    -
    4512 m_rparenthesis(rparenthesis),
    -
    4513 m_separator(separator),
    -
    4514 m_space(space)
    -
    4515 {}
    -
    4516
    -
    4517 virtual void invalidate()
    -
    4518 {
    -
    4519 value.clear();
    - -
    4521 }
    -
    4522
    -
    4523 std::basic_string<T> value;
    -
    4524
    -
    4525 protected:
    -
    4526 virtual bool do_match(
    -
    4527 _In_reads_or_z_opt_(end) const T* text,
    -
    4528 _In_ size_t start = 0,
    -
    4529 _In_ size_t end = SIZE_MAX,
    -
    4530 _In_ int flags = match_default)
    -
    4531 {
    -
    4532 _Assume_(text || start >= end);
    -
    4533
    -
    4534 size_t safe_digit_end = start, safe_value_size = 0;
    -
    4535 bool has_digits = false, after_digit = false, in_parentheses = false, after_parentheses = false;
    -
    4536 const int space_match_flags = flags & ~match_multiline; // Spaces in phone numbers must never be broken in new line.
    -
    4537
    -
    4538 this->interval.end = start;
    -
    4539 value.clear();
    -
    4540 m_lparenthesis->invalidate();
    -
    4541 m_rparenthesis->invalidate();
    -
    4542
    -
    4543 if (m_plus_sign && m_plus_sign->match(text, this->interval.end, end, flags)) {
    -
    4544 value.append(text + m_plus_sign->interval.start, text + m_plus_sign->interval.end);
    -
    4545 safe_value_size = value.size();
    -
    4546 this->interval.end = m_plus_sign->interval.end;
    -
    4547 }
    -
    4548
    -
    4549 for (;;) {
    -
    4550 _Assume_(text || this->interval.end >= end);
    -
    4551 if (this->interval.end >= end || !text[this->interval.end])
    -
    4552 break;
    -
    4553 if (m_digit->match(text, this->interval.end, end, flags)) {
    -
    4554 // Digit
    -
    4555 value.append(text + m_digit->interval.start, text + m_digit->interval.end);
    -
    4556 this->interval.end = m_digit->interval.end;
    -
    4557 if (!in_parentheses) {
    -
    4558 safe_digit_end = this->interval.end;
    -
    4559 safe_value_size = value.size();
    -
    4560 has_digits = true;
    -
    4561 }
    -
    4562 after_digit = true;
    -
    4563 after_parentheses = false;
    -
    4564 }
    -
    4565 else if (
    -
    4566 m_lparenthesis && !m_lparenthesis->interval && // No left parenthesis yet
    -
    4567 m_rparenthesis && !m_rparenthesis->interval && // Right parenthesis after left
    -
    4568 m_lparenthesis->match(text, this->interval.end, end, flags))
    -
    4569 {
    -
    4570 // Left parenthesis
    -
    4571 value.append(text + m_lparenthesis->interval.start, m_lparenthesis->interval.size());
    -
    4572 this->interval.end = m_lparenthesis->interval.end;
    -
    4573 in_parentheses = true;
    -
    4574 after_digit = false;
    -
    4575 after_parentheses = false;
    -
    4576 }
    -
    4577 else if (
    -
    4578 in_parentheses && // After left parenthesis
    -
    4579 m_rparenthesis && !m_rparenthesis->interval && // No right parenthesis yet
    -
    4580 m_rparenthesis->match(text, this->interval.end, end, flags) &&
    -
    4581 m_lparenthesis->hit_offset == m_rparenthesis->hit_offset) // Left and right parentheses must match
    -
    4582 {
    -
    4583 // Right parenthesis
    -
    4584 value.append(text + m_rparenthesis->interval.start, text + m_rparenthesis->interval.end);
    -
    4585 this->interval.end = m_rparenthesis->interval.end;
    -
    4586 safe_digit_end = this->interval.end;
    -
    4587 safe_value_size = value.size();
    -
    4588 in_parentheses = false;
    -
    4589 after_digit = false;
    -
    4590 after_parentheses = true;
    -
    4591 }
    -
    4592 else if (
    -
    4593 after_digit &&
    -
    4594 !in_parentheses && // No separators inside parentheses
    -
    4595 !after_parentheses && // No separators following right parenthesis
    -
    4596 m_separator && m_separator->match(text, this->interval.end, end, flags))
    -
    4597 {
    -
    4598 // Separator
    -
    4599 this->interval.end = m_separator->interval.end;
    -
    4600 after_digit = false;
    -
    4601 after_parentheses = false;
    -
    4602 }
    -
    4603 else if (
    - -
    4605 m_space && m_space->match(text, this->interval.end, end, space_match_flags))
    -
    4606 {
    -
    4607 // Space
    -
    4608 this->interval.end = m_space->interval.end;
    -
    4609 after_digit = false;
    -
    4610 after_parentheses = false;
    -
    4611 }
    -
    4612 else
    -
    4613 break;
    -
    4614 }
    -
    4615 if (has_digits) {
    -
    4616 value.erase(safe_value_size);
    -
    4617 this->interval.start = start;
    -
    4618 this->interval.end = safe_digit_end;
    -
    4619 return true;
    -
    4620 }
    -
    4621 value.clear();
    -
    4622 this->interval.invalidate();
    -
    4623 return false;
    -
    4624 }
    -
    4625
    -
    4626 std::shared_ptr<basic_parser<T>> m_digit;
    -
    4627 std::shared_ptr<basic_parser<T>> m_plus_sign;
    -
    4628 std::shared_ptr<basic_set<T>> m_lparenthesis;
    -
    4629 std::shared_ptr<basic_set<T>> m_rparenthesis;
    -
    4630 std::shared_ptr<basic_parser<T>> m_separator;
    -
    4631 std::shared_ptr<basic_parser<T>> m_space;
    -
    4632 };
    +
    4484
    +
    4485 using angle = basic_angle<char>;
    + +
    4487#ifdef _UNICODE
    +
    4488 using RRegElKot = wangle;
    +
    4489#else
    +
    4490 using RRegElKot = angle;
    +
    4491#endif
    + +
    4493
    +
    4497 template <class T>
    +
    + +
    4499 {
    +
    4500 public:
    + +
    4502 _In_ const std::shared_ptr<basic_parser<T>>& digit,
    +
    4503 _In_ const std::shared_ptr<basic_parser<T>>& plus_sign,
    +
    4504 _In_ const std::shared_ptr<basic_set<T>>& lparenthesis,
    +
    4505 _In_ const std::shared_ptr<basic_set<T>>& rparenthesis,
    +
    4506 _In_ const std::shared_ptr<basic_parser<T>>& separator,
    +
    4507 _In_ const std::shared_ptr<basic_parser<T>>& space,
    +
    4508 _In_ const std::locale& locale = std::locale()) :
    + +
    4510 m_digit(digit),
    +
    4511 m_plus_sign(plus_sign),
    +
    4512 m_lparenthesis(lparenthesis),
    +
    4513 m_rparenthesis(rparenthesis),
    +
    4514 m_separator(separator),
    +
    4515 m_space(space)
    +
    4516 {}
    +
    4517
    +
    4518 virtual void invalidate()
    +
    4519 {
    +
    4520 value.clear();
    + +
    4522 }
    +
    4523
    +
    4524 std::basic_string<T> value;
    +
    4525
    +
    4526 protected:
    +
    4527 virtual bool do_match(
    +
    4528 _In_reads_or_z_opt_(end) const T* text,
    +
    4529 _In_ size_t start = 0,
    +
    4530 _In_ size_t end = SIZE_MAX,
    +
    4531 _In_ int flags = match_default)
    +
    4532 {
    +
    4533 _Assume_(text || start >= end);
    +
    4534
    +
    4535 size_t safe_digit_end = start, safe_value_size = 0;
    +
    4536 bool has_digits = false, after_digit = false, in_parentheses = false, after_parentheses = false;
    +
    4537 const int space_match_flags = flags & ~match_multiline; // Spaces in phone numbers must never be broken in new line.
    +
    4538
    +
    4539 this->interval.end = start;
    +
    4540 value.clear();
    +
    4541 m_lparenthesis->invalidate();
    +
    4542 m_rparenthesis->invalidate();
    +
    4543
    +
    4544 if (m_plus_sign && m_plus_sign->match(text, this->interval.end, end, flags)) {
    +
    4545 value.append(text + m_plus_sign->interval.start, text + m_plus_sign->interval.end);
    +
    4546 safe_value_size = value.size();
    +
    4547 this->interval.end = m_plus_sign->interval.end;
    +
    4548 }
    +
    4549
    +
    4550 for (;;) {
    +
    4551 _Assume_(text || this->interval.end >= end);
    +
    4552 if (this->interval.end >= end || !text[this->interval.end])
    +
    4553 break;
    +
    4554 if (m_digit->match(text, this->interval.end, end, flags)) {
    +
    4555 // Digit
    +
    4556 value.append(text + m_digit->interval.start, text + m_digit->interval.end);
    +
    4557 this->interval.end = m_digit->interval.end;
    +
    4558 if (!in_parentheses) {
    +
    4559 safe_digit_end = this->interval.end;
    +
    4560 safe_value_size = value.size();
    +
    4561 has_digits = true;
    +
    4562 }
    +
    4563 after_digit = true;
    +
    4564 after_parentheses = false;
    +
    4565 }
    +
    4566 else if (
    +
    4567 m_lparenthesis && !m_lparenthesis->interval && // No left parenthesis yet
    +
    4568 m_rparenthesis && !m_rparenthesis->interval && // Right parenthesis after left
    +
    4569 m_lparenthesis->match(text, this->interval.end, end, flags))
    +
    4570 {
    +
    4571 // Left parenthesis
    +
    4572 value.append(text + m_lparenthesis->interval.start, m_lparenthesis->interval.size());
    +
    4573 this->interval.end = m_lparenthesis->interval.end;
    +
    4574 in_parentheses = true;
    +
    4575 after_digit = false;
    +
    4576 after_parentheses = false;
    +
    4577 }
    +
    4578 else if (
    +
    4579 in_parentheses && // After left parenthesis
    +
    4580 m_rparenthesis && !m_rparenthesis->interval && // No right parenthesis yet
    +
    4581 m_rparenthesis->match(text, this->interval.end, end, flags) &&
    +
    4582 m_lparenthesis->hit_offset == m_rparenthesis->hit_offset) // Left and right parentheses must match
    +
    4583 {
    +
    4584 // Right parenthesis
    +
    4585 value.append(text + m_rparenthesis->interval.start, text + m_rparenthesis->interval.end);
    +
    4586 this->interval.end = m_rparenthesis->interval.end;
    +
    4587 safe_digit_end = this->interval.end;
    +
    4588 safe_value_size = value.size();
    +
    4589 in_parentheses = false;
    +
    4590 after_digit = false;
    +
    4591 after_parentheses = true;
    +
    4592 }
    +
    4593 else if (
    +
    4594 after_digit &&
    +
    4595 !in_parentheses && // No separators inside parentheses
    +
    4596 !after_parentheses && // No separators following right parenthesis
    +
    4597 m_separator && m_separator->match(text, this->interval.end, end, flags))
    +
    4598 {
    +
    4599 // Separator
    +
    4600 this->interval.end = m_separator->interval.end;
    +
    4601 after_digit = false;
    +
    4602 after_parentheses = false;
    +
    4603 }
    +
    4604 else if (
    + +
    4606 m_space && m_space->match(text, this->interval.end, end, space_match_flags))
    +
    4607 {
    +
    4608 // Space
    +
    4609 this->interval.end = m_space->interval.end;
    +
    4610 after_digit = false;
    +
    4611 after_parentheses = false;
    +
    4612 }
    +
    4613 else
    +
    4614 break;
    +
    4615 }
    +
    4616 if (has_digits) {
    +
    4617 value.erase(safe_value_size);
    +
    4618 this->interval.start = start;
    +
    4619 this->interval.end = safe_digit_end;
    +
    4620 return true;
    +
    4621 }
    +
    4622 value.clear();
    +
    4623 this->interval.invalidate();
    +
    4624 return false;
    +
    4625 }
    +
    4626
    +
    4627 std::shared_ptr<basic_parser<T>> m_digit;
    +
    4628 std::shared_ptr<basic_parser<T>> m_plus_sign;
    +
    4629 std::shared_ptr<basic_set<T>> m_lparenthesis;
    +
    4630 std::shared_ptr<basic_set<T>> m_rparenthesis;
    +
    4631 std::shared_ptr<basic_parser<T>> m_separator;
    +
    4632 std::shared_ptr<basic_parser<T>> m_space;
    +
    4633 };
    -
    4633
    -
    4634 using phone_number = basic_phone_number<char>;
    -
    4635 using wphone_number = basic_phone_number<wchar_t>;
    -
    4636#ifdef _UNICODE
    -
    4637 using tphone_number = wphone_number;
    -
    4638#else
    -
    4639 using tphone_number = phone_number;
    -
    4640#endif
    -
    4641 using sgml_phone_number = basic_phone_number<char>;
    -
    4642
    -
    4648 template <class T>
    -
    -
    4649 class basic_iban : public basic_parser<T>
    -
    4650 {
    -
    4651 public:
    -
    4652 basic_iban(
    -
    4653 _In_ const std::shared_ptr<basic_parser<T>>& space,
    -
    4654 _In_ const std::locale& locale = std::locale()) :
    - -
    4656 m_space(space)
    -
    4657 {
    -
    4658 this->country[0] = 0;
    -
    4659 this->check_digits[0] = 0;
    -
    4660 this->bban[0] = 0;
    -
    4661 this->is_valid = false;
    -
    4662 }
    -
    4663
    -
    4664 virtual void invalidate()
    -
    4665 {
    -
    4666 this->country[0] = 0;
    -
    4667 this->check_digits[0] = 0;
    -
    4668 this->bban[0] = 0;
    -
    4669 this->is_valid = false;
    - -
    4671 }
    -
    4672
    -
    4673 T country[3];
    - -
    4675 T bban[31];
    - -
    4677
    -
    4678 protected:
    -
    4679 virtual bool do_match(
    -
    4680 _In_reads_or_z_opt_(end) const T* text,
    -
    4681 _In_ size_t start = 0,
    -
    4682 _In_ size_t end = SIZE_MAX,
    -
    4683 _In_ int flags = match_default)
    -
    4684 {
    -
    4685 _Assume_(text || start >= end);
    -
    4686 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    -
    4687 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    -
    4688 struct country_t {
    -
    4689 T country[2];
    -
    4690 T check_digits[2];
    -
    4691 size_t length;
    -
    4692 };
    -
    4693 static const country_t s_countries[] = {
    -
    4694 { { 'A', 'D' }, {}, 24 }, // Andorra
    -
    4695 { { 'A', 'E' }, {}, 23 }, // United Arab Emirates
    -
    4696 { { 'A', 'L' }, {}, 28 }, // Albania
    -
    4697 { { 'A', 'O' }, {}, 25 }, // Angola
    -
    4698 { { 'A', 'T' }, {}, 20 }, // Austria
    -
    4699 { { 'A', 'Z' }, {}, 28 }, // Azerbaijan
    -
    4700 { { 'B', 'A' }, { '3', '9' }, 20}, // Bosnia and Herzegovina
    -
    4701 { { 'B', 'E' }, {}, 16 }, // Belgium
    -
    4702 { { 'B', 'F' }, {}, 28 }, // Burkina Faso
    -
    4703 { { 'B', 'G' }, {}, 22 }, // Bulgaria
    -
    4704 { { 'B', 'H' }, {}, 22 }, // Bahrain
    -
    4705 { { 'B', 'I' }, {}, 27 }, // Burundi
    -
    4706 { { 'B', 'J' }, {}, 28 }, // Benin
    -
    4707 { { 'B', 'R' }, {}, 29 }, // Brazil
    -
    4708 { { 'B', 'Y' }, {}, 28 }, // Belarus
    -
    4709 { { 'C', 'F' }, {}, 27 }, // Central African Republic
    -
    4710 { { 'C', 'G' }, {}, 27 }, // Congo, Republic of the
    -
    4711 { { 'C', 'H' }, {}, 21 }, // Switzerland
    -
    4712 { { 'C', 'I' }, {}, 28 }, // Côte d'Ivoire
    -
    4713 { { 'C', 'M' }, {}, 27 }, // Cameroon
    -
    4714 { { 'C', 'R' }, {}, 22 }, // Costa Rica
    -
    4715 { { 'C', 'V' }, {}, 25 }, // Cabo Verde
    -
    4716 { { 'C', 'Y' }, {}, 28 }, // Cyprus
    -
    4717 { { 'C', 'Z' }, {}, 24 }, // Czech Republic
    -
    4718 { { 'D', 'E' }, {}, 22 }, // Germany
    -
    4719 { { 'D', 'J' }, {}, 27 }, // Djibouti
    -
    4720 { { 'D', 'K' }, {}, 18 }, // Denmark
    -
    4721 { { 'D', 'O' }, {}, 28 }, // Dominican Republic
    -
    4722 { { 'D', 'Z' }, {}, 26 }, // Algeria
    -
    4723 { { 'E', 'E' }, {}, 20 }, // Estonia
    -
    4724 { { 'E', 'G' }, {}, 29 }, // Egypt
    -
    4725 { { 'E', 'S' }, {}, 24 }, // Spain
    -
    4726 { { 'F', 'I' }, {}, 18 }, // Finland
    -
    4727 { { 'F', 'O' }, {}, 18 }, // Faroe Islands
    -
    4728 { { 'F', 'R' }, {}, 27 }, // France
    -
    4729 { { 'G', 'A' }, {}, 27 }, // Gabon
    -
    4730 { { 'G', 'B' }, {}, 22 }, // United Kingdom
    -
    4731 { { 'G', 'E' }, {}, 22 }, // Georgia
    -
    4732 { { 'G', 'I' }, {}, 23 }, // Gibraltar
    -
    4733 { { 'G', 'L' }, {}, 18 }, // Greenland
    -
    4734 { { 'G', 'Q' }, {}, 27 }, // Equatorial Guinea
    -
    4735 { { 'G', 'R' }, {}, 27 }, // Greece
    -
    4736 { { 'G', 'T' }, {}, 28 }, // Guatemala
    -
    4737 { { 'G', 'W' }, {}, 25 }, // Guinea-Bissau
    -
    4738 { { 'H', 'N' }, {}, 28 }, // Honduras
    -
    4739 { { 'H', 'R' }, {}, 21 }, // Croatia
    -
    4740 { { 'H', 'U' }, {}, 28 }, // Hungary
    -
    4741 { { 'I', 'E' }, {}, 22 }, // Ireland
    -
    4742 { { 'I', 'L' }, {}, 23 }, // Israel
    -
    4743 { { 'I', 'Q' }, {}, 23 }, // Iraq
    -
    4744 { { 'I', 'R' }, {}, 26 }, // Iran
    -
    4745 { { 'I', 'S' }, {}, 26 }, // Iceland
    -
    4746 { { 'I', 'T' }, {}, 27 }, // Italy
    -
    4747 { { 'J', 'O' }, {}, 30 }, // Jordan
    -
    4748 { { 'K', 'M' }, {}, 27 }, // Comoros
    -
    4749 { { 'K', 'W' }, {}, 30 }, // Kuwait
    -
    4750 { { 'K', 'Z' }, {}, 20 }, // Kazakhstan
    -
    4751 { { 'L', 'B' }, {}, 28 }, // Lebanon
    -
    4752 { { 'L', 'C' }, {}, 32 }, // Saint Lucia
    -
    4753 { { 'L', 'I' }, {}, 21 }, // Liechtenstein
    -
    4754 { { 'L', 'T' }, {}, 20 }, // Lithuania
    -
    4755 { { 'L', 'U' }, {}, 20 }, // Luxembourg
    -
    4756 { { 'L', 'V' }, {}, 21 }, // Latvia
    -
    4757 { { 'L', 'Y' }, {}, 25 }, // Libya
    -
    4758 { { 'M', 'A' }, {}, 28 }, // Morocco
    -
    4759 { { 'M', 'C' }, {}, 27 }, // Monaco
    -
    4760 { { 'M', 'D' }, {}, 24 }, // Moldova
    -
    4761 { { 'M', 'E' }, { '2', '5' }, 22 }, // Montenegro
    -
    4762 { { 'M', 'G' }, {}, 27 }, // Madagascar
    -
    4763 { { 'M', 'K' }, { '0', '7' }, 19 }, // North Macedonia
    -
    4764 { { 'M', 'L' }, {}, 28 }, // Mali
    -
    4765 { { 'M', 'R' }, { '1', '3' }, 27}, // Mauritania
    -
    4766 { { 'M', 'T' }, {}, 31 }, // Malta
    -
    4767 { { 'M', 'U' }, {}, 30 }, // Mauritius
    -
    4768 { { 'M', 'Z' }, {}, 25 }, // Mozambique
    -
    4769 { { 'N', 'E' }, {}, 28 }, // Niger
    -
    4770 { { 'N', 'I' }, {}, 32 }, // Nicaragua
    -
    4771 { { 'N', 'L' }, {}, 18 }, // Netherlands
    -
    4772 { { 'N', 'O' }, {}, 15 }, // Norway
    -
    4773 { { 'P', 'K' }, {}, 24 }, // Pakistan
    -
    4774 { { 'P', 'L' }, {}, 28 }, // Poland
    -
    4775 { { 'P', 'S' }, {}, 29 }, // Palestinian territories
    -
    4776 { { 'P', 'T' }, { '5', '0' }, 25 }, // Portugal
    -
    4777 { { 'Q', 'A' }, {}, 29 }, // Qatar
    -
    4778 { { 'R', 'O' }, {}, 24 }, // Romania
    -
    4779 { { 'R', 'S' }, { '3', '5' }, 22 }, // Serbia
    -
    4780 { { 'R', 'U' }, {}, 33 }, // Russia
    -
    4781 { { 'S', 'A' }, {}, 24 }, // Saudi Arabia
    -
    4782 { { 'S', 'C' }, {}, 31 }, // Seychelles
    -
    4783 { { 'S', 'D' }, {}, 18 }, // Sudan
    -
    4784 { { 'S', 'E' }, {}, 24 }, // Sweden
    -
    4785 { { 'S', 'I' }, { '5', '6' }, 19 }, // Slovenia
    -
    4786 { { 'S', 'K' }, {}, 24 }, // Slovakia
    -
    4787 { { 'S', 'M' }, {}, 27 }, // San Marino
    -
    4788 { { 'S', 'N' }, {}, 28 }, // Senegal
    -
    4789 { { 'S', 'T' }, {}, 25 }, // São Tomé and Príncipe
    -
    4790 { { 'S', 'V' }, {}, 28 }, // El Salvador
    -
    4791 { { 'T', 'D' }, {}, 27 }, // Chad
    -
    4792 { { 'T', 'G' }, {}, 28 }, // Togo
    -
    4793 { { 'T', 'L' }, { '3', '8' }, 23}, // East Timor
    -
    4794 { { 'T', 'N' }, { '5', '9' }, 24 }, // Tunisia
    -
    4795 { { 'T', 'R' }, {}, 26 }, // Turkey
    -
    4796 { { 'U', 'A' }, {}, 29 }, // Ukraine
    -
    4797 { { 'V', 'A' }, {}, 22 }, // Vatican City
    -
    4798 { { 'V', 'G' }, {}, 24 }, // Virgin Islands, British
    -
    4799 { { 'X', 'K' }, {}, 20 }, // Kosovo
    -
    4800 };
    -
    4801 const country_t* country_desc = nullptr;
    -
    4802 size_t n, available, next, bban_length;
    - -
    4804
    -
    4805 this->interval.end = start;
    -
    4806 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    -
    4807 if (this->interval.end >= end || !text[this->interval.end])
    -
    4808 goto error; // incomplete country code
    -
    4809 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    -
    4810 if (chr < 'A' || 'Z' < chr)
    -
    4811 goto error; // invalid country code
    -
    4812 this->country[i] = chr;
    -
    4813 }
    -
    4814 for (size_t l = 0, r = _countof(s_countries);;) {
    -
    4815 if (l >= r)
    -
    4816 goto error; // unknown country
    -
    4817 size_t m = (l + r) / 2;
    -
    4818 const country_t& c = s_countries[m];
    -
    4819 if (c.country[0] < this->country[0] || (c.country[0] == this->country[0] && c.country[1] < this->country[1]))
    -
    4820 l = m + 1;
    -
    4821 else if (this->country[0] < c.country[0] || (this->country[0] == c.country[0] && this->country[1] < c.country[1]))
    -
    4822 r = m;
    -
    4823 else {
    -
    4824 country_desc = &c;
    -
    4825 break;
    -
    4826 }
    -
    4827 }
    -
    4828 this->country[2] = 0;
    -
    4829
    -
    4830 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    -
    4831 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    -
    4832 goto error; // incomplete or invalid check digits
    -
    4833 this->check_digits[i] = text[this->interval.end];
    -
    4834 }
    -
    4835 this->check_digits[2] = 0;
    -
    4836
    -
    4837 if ((country_desc->check_digits[0] && this->check_digits[0] != country_desc->check_digits[0]) ||
    -
    4838 (country_desc->check_digits[1] && this->check_digits[1] != country_desc->check_digits[1]))
    -
    4839 goto error; // unexpected check digits
    -
    4840
    -
    4841 bban_length = country_desc->length - 4;
    -
    4842 for (n = 0; n < bban_length;) {
    -
    4843 if (this->interval.end >= end || !text[this->interval.end])
    -
    4844 goto error; // bban too short
    -
    4845 if (m_space && m_space->match(text, this->interval.end, end, flags)) {
    -
    4846 this->interval.end = m_space->interval.end;
    -
    4847 continue;
    -
    4848 }
    -
    4849 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    -
    4850 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
    -
    4851 this->bban[n++] = chr;
    -
    4852 this->interval.end++;
    -
    4853 }
    -
    4854 else
    -
    4855 goto error; // invalid bban
    -
    4856 }
    -
    4857 this->bban[n] = 0;
    -
    4858
    -
    4859 // Normalize IBAN.
    -
    4860 T normalized[69];
    -
    4861 available = 0;
    -
    4862 for (size_t i = 0; ; ++i) {
    -
    4863 if (!this->bban[i]) {
    -
    4864 for (i = 0; i < 2; ++i) {
    -
    4865 if ('A' <= this->country[i] && this->country[i] <= 'J') {
    -
    4866 normalized[available++] = '1';
    -
    4867 normalized[available++] = '0' + this->country[i] - 'A';
    -
    4868 }
    -
    4869 else if ('K' <= this->country[i] && this->country[i] <= 'T') {
    -
    4870 normalized[available++] = '2';
    -
    4871 normalized[available++] = '0' + this->country[i] - 'K';
    -
    4872 }
    -
    4873 else if ('U' <= this->country[i] && this->country[i] <= 'Z') {
    -
    4874 normalized[available++] = '3';
    -
    4875 normalized[available++] = '0' + this->country[i] - 'U';
    -
    4876 }
    -
    4877 }
    -
    4878 normalized[available++] = this->check_digits[0];
    -
    4879 normalized[available++] = this->check_digits[1];
    -
    4880 normalized[available] = 0;
    -
    4881 break;
    -
    4882 }
    -
    4883 if ('0' <= this->bban[i] && this->bban[i] <= '9')
    -
    4884 normalized[available++] = this->bban[i];
    -
    4885 else if ('A' <= this->bban[i] && this->bban[i] <= 'J') {
    -
    4886 normalized[available++] = '1';
    -
    4887 normalized[available++] = '0' + this->bban[i] - 'A';
    -
    4888 }
    -
    4889 else if ('K' <= this->bban[i] && this->bban[i] <= 'T') {
    -
    4890 normalized[available++] = '2';
    -
    4891 normalized[available++] = '0' + this->bban[i] - 'K';
    -
    4892 }
    -
    4893 else if ('U' <= this->bban[i] && this->bban[i] <= 'Z') {
    -
    4894 normalized[available++] = '3';
    -
    4895 normalized[available++] = '0' + this->bban[i] - 'U';
    -
    4896 }
    -
    4897 }
    -
    4898
    -
    4899 // Calculate modulo 97.
    -
    4900 nominator = stdex::strtou32(normalized, 9, &next, 10);
    -
    4901 for (;;) {
    -
    4902 nominator %= 97;
    -
    4903 if (!normalized[next]) {
    -
    4904 this->is_valid = nominator == 1;
    -
    4905 break;
    -
    4906 }
    -
    4907 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
    -
    4908 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
    -
    4909 nominator = nominator * 10 + (normalized[next] - '0');
    -
    4910 }
    -
    4911
    -
    4912 this->interval.start = start;
    -
    4913 return true;
    -
    4914
    -
    4915 error:
    -
    4916 invalidate();
    -
    4917 return false;
    -
    4918 }
    -
    4919
    -
    4920 std::shared_ptr<basic_parser<T>> m_space;
    -
    4921 };
    +
    4634
    +
    4635 using phone_number = basic_phone_number<char>;
    +
    4636 using wphone_number = basic_phone_number<wchar_t>;
    +
    4637#ifdef _UNICODE
    +
    4638 using tphone_number = wphone_number;
    +
    4639#else
    +
    4640 using tphone_number = phone_number;
    +
    4641#endif
    +
    4642 using sgml_phone_number = basic_phone_number<char>;
    +
    4643
    +
    4649 template <class T>
    +
    +
    4650 class basic_iban : public basic_parser<T>
    +
    4651 {
    +
    4652 public:
    +
    4653 basic_iban(
    +
    4654 _In_ const std::shared_ptr<basic_parser<T>>& space,
    +
    4655 _In_ const std::locale& locale = std::locale()) :
    + +
    4657 m_space(space)
    +
    4658 {
    +
    4659 this->country[0] = 0;
    +
    4660 this->check_digits[0] = 0;
    +
    4661 this->bban[0] = 0;
    +
    4662 this->is_valid = false;
    +
    4663 }
    +
    4664
    +
    4665 virtual void invalidate()
    +
    4666 {
    +
    4667 this->country[0] = 0;
    +
    4668 this->check_digits[0] = 0;
    +
    4669 this->bban[0] = 0;
    +
    4670 this->is_valid = false;
    + +
    4672 }
    +
    4673
    +
    4674 T country[3];
    + +
    4676 T bban[31];
    + +
    4678
    +
    4679 protected:
    +
    4680 virtual bool do_match(
    +
    4681 _In_reads_or_z_opt_(end) const T* text,
    +
    4682 _In_ size_t start = 0,
    +
    4683 _In_ size_t end = SIZE_MAX,
    +
    4684 _In_ int flags = match_default)
    +
    4685 {
    +
    4686 _Assume_(text || start >= end);
    +
    4687 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    +
    4688 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    +
    4689 struct country_t {
    +
    4690 T country[2];
    +
    4691 T check_digits[2];
    +
    4692 size_t length;
    +
    4693 };
    +
    4694 static const country_t s_countries[] = {
    +
    4695 { { 'A', 'D' }, {}, 24 }, // Andorra
    +
    4696 { { 'A', 'E' }, {}, 23 }, // United Arab Emirates
    +
    4697 { { 'A', 'L' }, {}, 28 }, // Albania
    +
    4698 { { 'A', 'O' }, {}, 25 }, // Angola
    +
    4699 { { 'A', 'T' }, {}, 20 }, // Austria
    +
    4700 { { 'A', 'Z' }, {}, 28 }, // Azerbaijan
    +
    4701 { { 'B', 'A' }, { '3', '9' }, 20}, // Bosnia and Herzegovina
    +
    4702 { { 'B', 'E' }, {}, 16 }, // Belgium
    +
    4703 { { 'B', 'F' }, {}, 28 }, // Burkina Faso
    +
    4704 { { 'B', 'G' }, {}, 22 }, // Bulgaria
    +
    4705 { { 'B', 'H' }, {}, 22 }, // Bahrain
    +
    4706 { { 'B', 'I' }, {}, 27 }, // Burundi
    +
    4707 { { 'B', 'J' }, {}, 28 }, // Benin
    +
    4708 { { 'B', 'R' }, {}, 29 }, // Brazil
    +
    4709 { { 'B', 'Y' }, {}, 28 }, // Belarus
    +
    4710 { { 'C', 'F' }, {}, 27 }, // Central African Republic
    +
    4711 { { 'C', 'G' }, {}, 27 }, // Congo, Republic of the
    +
    4712 { { 'C', 'H' }, {}, 21 }, // Switzerland
    +
    4713 { { 'C', 'I' }, {}, 28 }, // Côte d'Ivoire
    +
    4714 { { 'C', 'M' }, {}, 27 }, // Cameroon
    +
    4715 { { 'C', 'R' }, {}, 22 }, // Costa Rica
    +
    4716 { { 'C', 'V' }, {}, 25 }, // Cabo Verde
    +
    4717 { { 'C', 'Y' }, {}, 28 }, // Cyprus
    +
    4718 { { 'C', 'Z' }, {}, 24 }, // Czech Republic
    +
    4719 { { 'D', 'E' }, {}, 22 }, // Germany
    +
    4720 { { 'D', 'J' }, {}, 27 }, // Djibouti
    +
    4721 { { 'D', 'K' }, {}, 18 }, // Denmark
    +
    4722 { { 'D', 'O' }, {}, 28 }, // Dominican Republic
    +
    4723 { { 'D', 'Z' }, {}, 26 }, // Algeria
    +
    4724 { { 'E', 'E' }, {}, 20 }, // Estonia
    +
    4725 { { 'E', 'G' }, {}, 29 }, // Egypt
    +
    4726 { { 'E', 'S' }, {}, 24 }, // Spain
    +
    4727 { { 'F', 'I' }, {}, 18 }, // Finland
    +
    4728 { { 'F', 'O' }, {}, 18 }, // Faroe Islands
    +
    4729 { { 'F', 'R' }, {}, 27 }, // France
    +
    4730 { { 'G', 'A' }, {}, 27 }, // Gabon
    +
    4731 { { 'G', 'B' }, {}, 22 }, // United Kingdom
    +
    4732 { { 'G', 'E' }, {}, 22 }, // Georgia
    +
    4733 { { 'G', 'I' }, {}, 23 }, // Gibraltar
    +
    4734 { { 'G', 'L' }, {}, 18 }, // Greenland
    +
    4735 { { 'G', 'Q' }, {}, 27 }, // Equatorial Guinea
    +
    4736 { { 'G', 'R' }, {}, 27 }, // Greece
    +
    4737 { { 'G', 'T' }, {}, 28 }, // Guatemala
    +
    4738 { { 'G', 'W' }, {}, 25 }, // Guinea-Bissau
    +
    4739 { { 'H', 'N' }, {}, 28 }, // Honduras
    +
    4740 { { 'H', 'R' }, {}, 21 }, // Croatia
    +
    4741 { { 'H', 'U' }, {}, 28 }, // Hungary
    +
    4742 { { 'I', 'E' }, {}, 22 }, // Ireland
    +
    4743 { { 'I', 'L' }, {}, 23 }, // Israel
    +
    4744 { { 'I', 'Q' }, {}, 23 }, // Iraq
    +
    4745 { { 'I', 'R' }, {}, 26 }, // Iran
    +
    4746 { { 'I', 'S' }, {}, 26 }, // Iceland
    +
    4747 { { 'I', 'T' }, {}, 27 }, // Italy
    +
    4748 { { 'J', 'O' }, {}, 30 }, // Jordan
    +
    4749 { { 'K', 'M' }, {}, 27 }, // Comoros
    +
    4750 { { 'K', 'W' }, {}, 30 }, // Kuwait
    +
    4751 { { 'K', 'Z' }, {}, 20 }, // Kazakhstan
    +
    4752 { { 'L', 'B' }, {}, 28 }, // Lebanon
    +
    4753 { { 'L', 'C' }, {}, 32 }, // Saint Lucia
    +
    4754 { { 'L', 'I' }, {}, 21 }, // Liechtenstein
    +
    4755 { { 'L', 'T' }, {}, 20 }, // Lithuania
    +
    4756 { { 'L', 'U' }, {}, 20 }, // Luxembourg
    +
    4757 { { 'L', 'V' }, {}, 21 }, // Latvia
    +
    4758 { { 'L', 'Y' }, {}, 25 }, // Libya
    +
    4759 { { 'M', 'A' }, {}, 28 }, // Morocco
    +
    4760 { { 'M', 'C' }, {}, 27 }, // Monaco
    +
    4761 { { 'M', 'D' }, {}, 24 }, // Moldova
    +
    4762 { { 'M', 'E' }, { '2', '5' }, 22 }, // Montenegro
    +
    4763 { { 'M', 'G' }, {}, 27 }, // Madagascar
    +
    4764 { { 'M', 'K' }, { '0', '7' }, 19 }, // North Macedonia
    +
    4765 { { 'M', 'L' }, {}, 28 }, // Mali
    +
    4766 { { 'M', 'R' }, { '1', '3' }, 27}, // Mauritania
    +
    4767 { { 'M', 'T' }, {}, 31 }, // Malta
    +
    4768 { { 'M', 'U' }, {}, 30 }, // Mauritius
    +
    4769 { { 'M', 'Z' }, {}, 25 }, // Mozambique
    +
    4770 { { 'N', 'E' }, {}, 28 }, // Niger
    +
    4771 { { 'N', 'I' }, {}, 32 }, // Nicaragua
    +
    4772 { { 'N', 'L' }, {}, 18 }, // Netherlands
    +
    4773 { { 'N', 'O' }, {}, 15 }, // Norway
    +
    4774 { { 'P', 'K' }, {}, 24 }, // Pakistan
    +
    4775 { { 'P', 'L' }, {}, 28 }, // Poland
    +
    4776 { { 'P', 'S' }, {}, 29 }, // Palestinian territories
    +
    4777 { { 'P', 'T' }, { '5', '0' }, 25 }, // Portugal
    +
    4778 { { 'Q', 'A' }, {}, 29 }, // Qatar
    +
    4779 { { 'R', 'O' }, {}, 24 }, // Romania
    +
    4780 { { 'R', 'S' }, { '3', '5' }, 22 }, // Serbia
    +
    4781 { { 'R', 'U' }, {}, 33 }, // Russia
    +
    4782 { { 'S', 'A' }, {}, 24 }, // Saudi Arabia
    +
    4783 { { 'S', 'C' }, {}, 31 }, // Seychelles
    +
    4784 { { 'S', 'D' }, {}, 18 }, // Sudan
    +
    4785 { { 'S', 'E' }, {}, 24 }, // Sweden
    +
    4786 { { 'S', 'I' }, { '5', '6' }, 19 }, // Slovenia
    +
    4787 { { 'S', 'K' }, {}, 24 }, // Slovakia
    +
    4788 { { 'S', 'M' }, {}, 27 }, // San Marino
    +
    4789 { { 'S', 'N' }, {}, 28 }, // Senegal
    +
    4790 { { 'S', 'T' }, {}, 25 }, // São Tomé and Príncipe
    +
    4791 { { 'S', 'V' }, {}, 28 }, // El Salvador
    +
    4792 { { 'T', 'D' }, {}, 27 }, // Chad
    +
    4793 { { 'T', 'G' }, {}, 28 }, // Togo
    +
    4794 { { 'T', 'L' }, { '3', '8' }, 23}, // East Timor
    +
    4795 { { 'T', 'N' }, { '5', '9' }, 24 }, // Tunisia
    +
    4796 { { 'T', 'R' }, {}, 26 }, // Turkey
    +
    4797 { { 'U', 'A' }, {}, 29 }, // Ukraine
    +
    4798 { { 'V', 'A' }, {}, 22 }, // Vatican City
    +
    4799 { { 'V', 'G' }, {}, 24 }, // Virgin Islands, British
    +
    4800 { { 'X', 'K' }, {}, 20 }, // Kosovo
    +
    4801 };
    +
    4802 const country_t* country_desc = nullptr;
    +
    4803 size_t n, available, next, bban_length;
    + +
    4805
    +
    4806 this->interval.end = start;
    +
    4807 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    +
    4808 if (this->interval.end >= end || !text[this->interval.end])
    +
    4809 goto error; // incomplete country code
    +
    4810 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    +
    4811 if (chr < 'A' || 'Z' < chr)
    +
    4812 goto error; // invalid country code
    +
    4813 this->country[i] = chr;
    +
    4814 }
    +
    4815 for (size_t l = 0, r = _countof(s_countries);;) {
    +
    4816 if (l >= r)
    +
    4817 goto error; // unknown country
    +
    4818 size_t m = (l + r) / 2;
    +
    4819 const country_t& c = s_countries[m];
    +
    4820 if (c.country[0] < this->country[0] || (c.country[0] == this->country[0] && c.country[1] < this->country[1]))
    +
    4821 l = m + 1;
    +
    4822 else if (this->country[0] < c.country[0] || (this->country[0] == c.country[0] && this->country[1] < c.country[1]))
    +
    4823 r = m;
    +
    4824 else {
    +
    4825 country_desc = &c;
    +
    4826 break;
    +
    4827 }
    +
    4828 }
    +
    4829 this->country[2] = 0;
    +
    4830
    +
    4831 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    +
    4832 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    +
    4833 goto error; // incomplete or invalid check digits
    +
    4834 this->check_digits[i] = text[this->interval.end];
    +
    4835 }
    +
    4836 this->check_digits[2] = 0;
    +
    4837
    +
    4838 if ((country_desc->check_digits[0] && this->check_digits[0] != country_desc->check_digits[0]) ||
    +
    4839 (country_desc->check_digits[1] && this->check_digits[1] != country_desc->check_digits[1]))
    +
    4840 goto error; // unexpected check digits
    +
    4841
    +
    4842 bban_length = country_desc->length - 4;
    +
    4843 for (n = 0; n < bban_length;) {
    +
    4844 if (this->interval.end >= end || !text[this->interval.end])
    +
    4845 goto error; // bban too short
    +
    4846 if (m_space && m_space->match(text, this->interval.end, end, flags)) {
    +
    4847 this->interval.end = m_space->interval.end;
    +
    4848 continue;
    +
    4849 }
    +
    4850 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    +
    4851 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
    +
    4852 this->bban[n++] = chr;
    +
    4853 this->interval.end++;
    +
    4854 }
    +
    4855 else
    +
    4856 goto error; // invalid bban
    +
    4857 }
    +
    4858 this->bban[n] = 0;
    +
    4859
    +
    4860 // Normalize IBAN.
    +
    4861 T normalized[69];
    +
    4862 available = 0;
    +
    4863 for (size_t i = 0; ; ++i) {
    +
    4864 if (!this->bban[i]) {
    +
    4865 for (i = 0; i < 2; ++i) {
    +
    4866 if ('A' <= this->country[i] && this->country[i] <= 'J') {
    +
    4867 normalized[available++] = '1';
    +
    4868 normalized[available++] = '0' + this->country[i] - 'A';
    +
    4869 }
    +
    4870 else if ('K' <= this->country[i] && this->country[i] <= 'T') {
    +
    4871 normalized[available++] = '2';
    +
    4872 normalized[available++] = '0' + this->country[i] - 'K';
    +
    4873 }
    +
    4874 else if ('U' <= this->country[i] && this->country[i] <= 'Z') {
    +
    4875 normalized[available++] = '3';
    +
    4876 normalized[available++] = '0' + this->country[i] - 'U';
    +
    4877 }
    +
    4878 }
    +
    4879 normalized[available++] = this->check_digits[0];
    +
    4880 normalized[available++] = this->check_digits[1];
    +
    4881 normalized[available] = 0;
    +
    4882 break;
    +
    4883 }
    +
    4884 if ('0' <= this->bban[i] && this->bban[i] <= '9')
    +
    4885 normalized[available++] = this->bban[i];
    +
    4886 else if ('A' <= this->bban[i] && this->bban[i] <= 'J') {
    +
    4887 normalized[available++] = '1';
    +
    4888 normalized[available++] = '0' + this->bban[i] - 'A';
    +
    4889 }
    +
    4890 else if ('K' <= this->bban[i] && this->bban[i] <= 'T') {
    +
    4891 normalized[available++] = '2';
    +
    4892 normalized[available++] = '0' + this->bban[i] - 'K';
    +
    4893 }
    +
    4894 else if ('U' <= this->bban[i] && this->bban[i] <= 'Z') {
    +
    4895 normalized[available++] = '3';
    +
    4896 normalized[available++] = '0' + this->bban[i] - 'U';
    +
    4897 }
    +
    4898 }
    +
    4899
    +
    4900 // Calculate modulo 97.
    +
    4901 nominator = stdex::strtou32(normalized, 9, &next, 10);
    +
    4902 for (;;) {
    +
    4903 nominator %= 97;
    +
    4904 if (!normalized[next]) {
    +
    4905 this->is_valid = nominator == 1;
    +
    4906 break;
    +
    4907 }
    +
    4908 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
    +
    4909 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
    +
    4910 nominator = nominator * 10 + (normalized[next] - '0');
    +
    4911 }
    +
    4912
    +
    4913 this->interval.start = start;
    +
    4914 return true;
    +
    4915
    +
    4916 error:
    +
    4917 invalidate();
    +
    4918 return false;
    +
    4919 }
    +
    4920
    +
    4921 std::shared_ptr<basic_parser<T>> m_space;
    +
    4922 };
    -
    4922
    -
    4923 using iban = basic_iban<char>;
    -
    4924 using wiban = basic_iban<wchar_t>;
    -
    4925#ifdef _UNICODE
    -
    4926 using tiban = wiban;
    -
    4927#else
    -
    4928 using tiban = iban;
    -
    4929#endif
    -
    4930 using sgml_iban = basic_iban<char>;
    -
    4931
    -
    4937 template <class T>
    -
    - -
    4939 {
    -
    4940 public:
    - -
    4942 _In_ const std::shared_ptr<basic_parser<T>>& space,
    -
    4943 _In_ const std::locale& locale = std::locale()) :
    - -
    4945 m_space(space)
    -
    4946 {
    -
    4947 this->check_digits[0] = 0;
    -
    4948 this->reference[0] = 0;
    -
    4949 this->is_valid = false;
    -
    4950 }
    -
    4951
    -
    4952 virtual void invalidate()
    -
    4953 {
    -
    4954 this->check_digits[0] = 0;
    -
    4955 this->reference[0] = 0;
    -
    4956 this->is_valid = false;
    - -
    4958 }
    -
    4959
    - - - -
    4963
    -
    4964 protected:
    -
    4965 virtual bool do_match(
    -
    4966 _In_reads_or_z_opt_(end) const T* text,
    -
    4967 _In_ size_t start = 0,
    -
    4968 _In_ size_t end = SIZE_MAX,
    -
    4969 _In_ int flags = match_default)
    -
    4970 {
    -
    4971 _Assume_(text || start >= end);
    -
    4972 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    -
    4973 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    -
    4974 size_t n, available, next;
    - -
    4976
    -
    4977 this->interval.end = start;
    -
    4978 if (this->interval.end + 1 >= end ||
    -
    4979 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'R' ||
    -
    4980 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'F')
    -
    4981 goto error; // incomplete or wrong reference ID
    -
    4982 this->interval.end += 2;
    -
    4983
    -
    4984 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    -
    4985 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    -
    4986 goto error; // incomplete or invalid check digits
    -
    4987 this->check_digits[i] = text[this->interval.end];
    -
    4988 }
    -
    4989 this->check_digits[2] = 0;
    -
    4990
    -
    4991 for (n = 0;;) {
    -
    4992 if (m_space && m_space->match(text, this->interval.end, end, flags))
    -
    4993 this->interval.end = m_space->interval.end;
    -
    4994 for (size_t j = 0; j < 4; ++j) {
    -
    4995 if (this->interval.end >= end || !text[this->interval.end])
    -
    4996 goto out;
    -
    4997 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    -
    4998 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
    -
    4999 if (n >= _countof(reference) - 1)
    -
    5000 goto error; // reference overflow
    -
    5001 this->reference[n++] = chr;
    -
    5002 this->interval.end++;
    -
    5003 }
    -
    5004 else
    -
    5005 goto out;
    -
    5006 }
    -
    5007 }
    -
    5008 out:
    -
    5009 if (!n)
    -
    5010 goto error; // reference too short
    -
    5011 this->reference[_countof(this->reference) - 1] = 0;
    -
    5012 for (size_t i = n, j = _countof(this->reference) - 1; i;)
    -
    5013 this->reference[--j] = this->reference[--i];
    -
    5014 for (size_t j = _countof(this->reference) - 1 - n; j;)
    -
    5015 this->reference[--j] = '0';
    -
    5016
    -
    5017 // Normalize creditor reference.
    -
    5018 T normalized[47];
    -
    5019 available = 0;
    -
    5020 for (size_t i = 0; ; ++i) {
    -
    5021 if (!this->reference[i]) {
    -
    5022 normalized[available++] = '2'; // R
    -
    5023 normalized[available++] = '7';
    -
    5024 normalized[available++] = '1'; // F
    -
    5025 normalized[available++] = '5';
    -
    5026 normalized[available++] = this->check_digits[0];
    -
    5027 normalized[available++] = this->check_digits[1];
    -
    5028 normalized[available] = 0;
    -
    5029 break;
    -
    5030 }
    -
    5031 if ('0' <= this->reference[i] && this->reference[i] <= '9')
    -
    5032 normalized[available++] = this->reference[i];
    -
    5033 else if ('A' <= this->reference[i] && this->reference[i] <= 'J') {
    -
    5034 normalized[available++] = '1';
    -
    5035 normalized[available++] = '0' + this->reference[i] - 'A';
    -
    5036 }
    -
    5037 else if ('K' <= this->reference[i] && this->reference[i] <= 'T') {
    -
    5038 normalized[available++] = '2';
    -
    5039 normalized[available++] = '0' + this->reference[i] - 'K';
    -
    5040 }
    -
    5041 else if ('U' <= this->reference[i] && this->reference[i] <= 'Z') {
    -
    5042 normalized[available++] = '3';
    -
    5043 normalized[available++] = '0' + this->reference[i] - 'U';
    -
    5044 }
    -
    5045 }
    -
    5046
    -
    5047 // Calculate modulo 97.
    -
    5048 nominator = stdex::strtou32(normalized, 9, &next, 10);
    -
    5049 for (;;) {
    -
    5050 nominator %= 97;
    -
    5051 if (!normalized[next]) {
    -
    5052 this->is_valid = nominator == 1;
    -
    5053 break;
    -
    5054 }
    -
    5055 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
    -
    5056 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
    -
    5057 nominator = nominator * 10 + (normalized[next] - '0');
    -
    5058 }
    -
    5059
    -
    5060 this->interval.start = start;
    -
    5061 return true;
    -
    5062
    -
    5063 error:
    -
    5064 invalidate();
    -
    5065 return false;
    -
    5066 }
    -
    5067
    -
    5068 std::shared_ptr<basic_parser<T>> m_space;
    -
    5069 };
    +
    4923
    +
    4924 using iban = basic_iban<char>;
    +
    4925 using wiban = basic_iban<wchar_t>;
    +
    4926#ifdef _UNICODE
    +
    4927 using tiban = wiban;
    +
    4928#else
    +
    4929 using tiban = iban;
    +
    4930#endif
    +
    4931 using sgml_iban = basic_iban<char>;
    +
    4932
    +
    4938 template <class T>
    +
    + +
    4940 {
    +
    4941 public:
    + +
    4943 _In_ const std::shared_ptr<basic_parser<T>>& space,
    +
    4944 _In_ const std::locale& locale = std::locale()) :
    + +
    4946 m_space(space)
    +
    4947 {
    +
    4948 this->check_digits[0] = 0;
    +
    4949 this->reference[0] = 0;
    +
    4950 this->is_valid = false;
    +
    4951 }
    +
    4952
    +
    4953 virtual void invalidate()
    +
    4954 {
    +
    4955 this->check_digits[0] = 0;
    +
    4956 this->reference[0] = 0;
    +
    4957 this->is_valid = false;
    + +
    4959 }
    +
    4960
    + + + +
    4964
    +
    4965 protected:
    +
    4966 virtual bool do_match(
    +
    4967 _In_reads_or_z_opt_(end) const T* text,
    +
    4968 _In_ size_t start = 0,
    +
    4969 _In_ size_t end = SIZE_MAX,
    +
    4970 _In_ int flags = match_default)
    +
    4971 {
    +
    4972 _Assume_(text || start >= end);
    +
    4973 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    +
    4974 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    +
    4975 size_t n, available, next;
    + +
    4977
    +
    4978 this->interval.end = start;
    +
    4979 if (this->interval.end + 1 >= end ||
    +
    4980 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'R' ||
    +
    4981 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'F')
    +
    4982 goto error; // incomplete or wrong reference ID
    +
    4983 this->interval.end += 2;
    +
    4984
    +
    4985 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    +
    4986 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    +
    4987 goto error; // incomplete or invalid check digits
    +
    4988 this->check_digits[i] = text[this->interval.end];
    +
    4989 }
    +
    4990 this->check_digits[2] = 0;
    +
    4991
    +
    4992 for (n = 0;;) {
    +
    4993 if (m_space && m_space->match(text, this->interval.end, end, flags))
    +
    4994 this->interval.end = m_space->interval.end;
    +
    4995 for (size_t j = 0; j < 4; ++j) {
    +
    4996 if (this->interval.end >= end || !text[this->interval.end])
    +
    4997 goto out;
    +
    4998 T chr = case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end];
    +
    4999 if (('0' <= chr && chr <= '9') || ('A' <= chr && chr <= 'Z')) {
    +
    5000 if (n >= _countof(reference) - 1)
    +
    5001 goto error; // reference overflow
    +
    5002 this->reference[n++] = chr;
    +
    5003 this->interval.end++;
    +
    5004 }
    +
    5005 else
    +
    5006 goto out;
    +
    5007 }
    +
    5008 }
    +
    5009 out:
    +
    5010 if (!n)
    +
    5011 goto error; // reference too short
    +
    5012 this->reference[_countof(this->reference) - 1] = 0;
    +
    5013 for (size_t i = n, j = _countof(this->reference) - 1; i;)
    +
    5014 this->reference[--j] = this->reference[--i];
    +
    5015 for (size_t j = _countof(this->reference) - 1 - n; j;)
    +
    5016 this->reference[--j] = '0';
    +
    5017
    +
    5018 // Normalize creditor reference.
    +
    5019 T normalized[47];
    +
    5020 available = 0;
    +
    5021 for (size_t i = 0; ; ++i) {
    +
    5022 if (!this->reference[i]) {
    +
    5023 normalized[available++] = '2'; // R
    +
    5024 normalized[available++] = '7';
    +
    5025 normalized[available++] = '1'; // F
    +
    5026 normalized[available++] = '5';
    +
    5027 normalized[available++] = this->check_digits[0];
    +
    5028 normalized[available++] = this->check_digits[1];
    +
    5029 normalized[available] = 0;
    +
    5030 break;
    +
    5031 }
    +
    5032 if ('0' <= this->reference[i] && this->reference[i] <= '9')
    +
    5033 normalized[available++] = this->reference[i];
    +
    5034 else if ('A' <= this->reference[i] && this->reference[i] <= 'J') {
    +
    5035 normalized[available++] = '1';
    +
    5036 normalized[available++] = '0' + this->reference[i] - 'A';
    +
    5037 }
    +
    5038 else if ('K' <= this->reference[i] && this->reference[i] <= 'T') {
    +
    5039 normalized[available++] = '2';
    +
    5040 normalized[available++] = '0' + this->reference[i] - 'K';
    +
    5041 }
    +
    5042 else if ('U' <= this->reference[i] && this->reference[i] <= 'Z') {
    +
    5043 normalized[available++] = '3';
    +
    5044 normalized[available++] = '0' + this->reference[i] - 'U';
    +
    5045 }
    +
    5046 }
    +
    5047
    +
    5048 // Calculate modulo 97.
    +
    5049 nominator = stdex::strtou32(normalized, 9, &next, 10);
    +
    5050 for (;;) {
    +
    5051 nominator %= 97;
    +
    5052 if (!normalized[next]) {
    +
    5053 this->is_valid = nominator == 1;
    +
    5054 break;
    +
    5055 }
    +
    5056 size_t digit_count = nominator == 0 ? 0 : nominator < 10 ? 1 : 2;
    +
    5057 for (; digit_count < 9 && normalized[next]; ++next, ++digit_count)
    +
    5058 nominator = nominator * 10 + (normalized[next] - '0');
    +
    5059 }
    +
    5060
    +
    5061 this->interval.start = start;
    +
    5062 return true;
    +
    5063
    +
    5064 error:
    +
    5065 invalidate();
    +
    5066 return false;
    +
    5067 }
    +
    5068
    +
    5069 std::shared_ptr<basic_parser<T>> m_space;
    +
    5070 };
    -
    5070
    -
    5071 using creditor_reference = basic_creditor_reference<char>;
    -
    5072 using wcreditor_reference = basic_creditor_reference<wchar_t>;
    -
    5073#ifdef _UNICODE
    -
    5074 using tcreditor_reference = wcreditor_reference;
    -
    5075#else
    -
    5076 using tcreditor_reference = creditor_reference;
    -
    5077#endif
    -
    5078 using sgml_creditor_reference = basic_creditor_reference<char>;
    -
    5079
    -
    5085 template <class T>
    -
    - -
    5087 {
    -
    5088 public:
    -
    5089 basic_si_reference_part(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    5090
    -
    5091 protected:
    -
    5092 virtual bool do_match(
    -
    5093 _In_reads_or_z_opt_(end) const T* text,
    -
    5094 _In_ size_t start = 0,
    -
    5095 _In_ size_t end = SIZE_MAX,
    -
    5096 _In_ int flags = match_default)
    -
    5097 {
    -
    5098 _Assume_(text || start >= end);
    -
    5099 this->interval.end = start;
    -
    5100 for (;;) {
    -
    5101 if (this->interval.end >= end || !text[this->interval.end])
    -
    5102 break;
    -
    5103 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9')
    -
    5104 this->interval.end++;
    -
    5105 else
    -
    5106 break;
    -
    5107 }
    - -
    5109 this->interval.start = start;
    -
    5110 return true;
    -
    5111 }
    -
    5112 this->interval.invalidate();
    -
    5113 return false;
    -
    5114 }
    -
    5115 };
    +
    5071
    +
    5072 using creditor_reference = basic_creditor_reference<char>;
    +
    5073 using wcreditor_reference = basic_creditor_reference<wchar_t>;
    +
    5074#ifdef _UNICODE
    +
    5075 using tcreditor_reference = wcreditor_reference;
    +
    5076#else
    +
    5077 using tcreditor_reference = creditor_reference;
    +
    5078#endif
    +
    5079 using sgml_creditor_reference = basic_creditor_reference<char>;
    +
    5080
    +
    5086 template <class T>
    +
    + +
    5088 {
    +
    5089 public:
    +
    5090 basic_si_reference_part(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    5091
    +
    5092 protected:
    +
    5093 virtual bool do_match(
    +
    5094 _In_reads_or_z_opt_(end) const T* text,
    +
    5095 _In_ size_t start = 0,
    +
    5096 _In_ size_t end = SIZE_MAX,
    +
    5097 _In_ int flags = match_default)
    +
    5098 {
    +
    5099 _Assume_(text || start >= end);
    +
    5100 this->interval.end = start;
    +
    5101 for (;;) {
    +
    5102 if (this->interval.end >= end || !text[this->interval.end])
    +
    5103 break;
    +
    5104 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9')
    +
    5105 this->interval.end++;
    +
    5106 else
    +
    5107 break;
    +
    5108 }
    + +
    5110 this->interval.start = start;
    +
    5111 return true;
    +
    5112 }
    +
    5113 this->interval.invalidate();
    +
    5114 return false;
    +
    5115 }
    +
    5116 };
    -
    5116
    - - -
    5119#ifdef _UNICODE
    - -
    5121#else
    - -
    5123#endif
    - -
    5125
    -
    5131 template <class T>
    -
    - -
    5133 {
    -
    5134 public:
    -
    5135 basic_si_reference_delimiter(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    -
    5136
    -
    5137 protected:
    -
    5138 virtual bool do_match(
    -
    5139 _In_reads_or_z_opt_(end) const T* text,
    -
    5140 _In_ size_t start = 0,
    -
    5141 _In_ size_t end = SIZE_MAX,
    -
    5142 _In_ int flags = match_default)
    -
    5143 {
    -
    5144 _Assume_(text || start >= end);
    -
    5145 if (start < end && text[start] == '-') {
    -
    5146 this->interval.end = (this->interval.start = start) + 1;
    -
    5147 return true;
    -
    5148 }
    -
    5149 this->interval.invalidate();
    -
    5150 return false;
    -
    5151 }
    -
    5152 };
    +
    5117
    + + +
    5120#ifdef _UNICODE
    + +
    5122#else
    + +
    5124#endif
    + +
    5126
    +
    5132 template <class T>
    +
    + +
    5134 {
    +
    5135 public:
    +
    5136 basic_si_reference_delimiter(_In_ const std::locale& locale = std::locale()) : basic_parser<T>(locale) {}
    +
    5137
    +
    5138 protected:
    +
    5139 virtual bool do_match(
    +
    5140 _In_reads_or_z_opt_(end) const T* text,
    +
    5141 _In_ size_t start = 0,
    +
    5142 _In_ size_t end = SIZE_MAX,
    +
    5143 _In_ int flags = match_default)
    +
    5144 {
    +
    5145 _Assume_(text || start >= end);
    +
    5146 if (start < end && text[start] == '-') {
    +
    5147 this->interval.end = (this->interval.start = start) + 1;
    +
    5148 return true;
    +
    5149 }
    +
    5150 this->interval.invalidate();
    +
    5151 return false;
    +
    5152 }
    +
    5153 };
    -
    5153
    - - -
    5156#ifdef _UNICODE
    - -
    5158#else
    - -
    5160#endif
    - -
    5162
    -
    5170 template <class T>
    -
    - -
    5172 {
    -
    5173 public:
    - -
    5175 _In_ const std::shared_ptr<basic_parser<T>>& space,
    -
    5176 _In_ const std::locale& locale = std::locale()) :
    - -
    5178 part1(locale),
    -
    5179 part2(locale),
    -
    5180 part3(locale),
    -
    5181 is_valid(false),
    -
    5182 m_space(space),
    -
    5183 m_delimiter(locale)
    -
    5184 {
    -
    5185 this->model[0] = 0;
    -
    5186 }
    -
    5187
    -
    5188 virtual void invalidate()
    -
    5189 {
    -
    5190 this->model[0] = 0;
    -
    5191 this->part1.invalidate();
    -
    5192 this->part2.invalidate();
    -
    5193 this->part3.invalidate();
    -
    5194 this->is_valid = false;
    - -
    5196 }
    -
    5197
    -
    5198 T model[3];
    - - - - -
    5203
    -
    5204 protected:
    -
    5205 virtual bool do_match(
    -
    5206 _In_reads_or_z_opt_(end) const T* text,
    -
    5207 _In_ size_t start = 0,
    -
    5208 _In_ size_t end = SIZE_MAX,
    -
    5209 _In_ int flags = match_default)
    -
    5210 {
    -
    5211 _Assume_(text || start >= end);
    -
    5212 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    -
    5213 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    -
    5214
    -
    5215 this->interval.end = start;
    -
    5216 if (this->interval.end + 1 >= end ||
    -
    5217 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'S' ||
    -
    5218 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'I')
    -
    5219 goto error; // incomplete or wrong reference ID
    -
    5220 this->interval.end += 2;
    -
    5221
    -
    5222 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    -
    5223 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    -
    5224 goto error; // incomplete or invalid model
    -
    5225 this->model[i] = text[this->interval.end];
    -
    5226 }
    -
    5227 this->model[2] = 0;
    -
    5228
    -
    5229 this->part1.invalidate();
    -
    5230 this->part2.invalidate();
    -
    5231 this->part3.invalidate();
    -
    5232 if (this->model[0] == '9' && this->model[1] == '9') {
    -
    5233 is_valid = true;
    -
    5234 this->interval.start = start;
    -
    5235 return true;
    -
    5236 }
    -
    5237
    -
    5238 if (m_space && m_space->match(text, this->interval.end, end, flags))
    -
    5239 this->interval.end = m_space->interval.end;
    -
    5240
    -
    5241 this->part1.match(text, this->interval.end, end, flags) &&
    -
    5242 this->m_delimiter.match(text, this->part1.interval.end, end, flags) &&
    -
    5243 this->part2.match(text, this->m_delimiter.interval.end, end, flags) &&
    -
    5244 this->m_delimiter.match(text, this->part2.interval.end, end, flags) &&
    -
    5245 this->part3.match(text, this->m_delimiter.interval.end, end, flags);
    -
    5246
    -
    5247 this->interval.start = start;
    -
    5248 if (this->part3.interval)
    -
    5249 this->interval.end = this->part3.interval.end;
    -
    5250 else if (this->part2.interval)
    -
    5251 this->interval.end = this->part2.interval.end;
    -
    5252 else if (this->part1.interval)
    -
    5253 this->interval.end = this->part1.interval.end;
    -
    5254 else
    -
    5255 this->interval.end = start + 4;
    -
    5256
    -
    5257 if (this->model[0] == '0' && this->model[1] == '0')
    -
    5258 is_valid =
    -
    5259 this->part3.interval ?
    -
    5260 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5261 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 :
    -
    5262 this->part2.interval ?
    -
    5263 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5264 this->part1.interval.size() + this->part2.interval.size() <= 20 :
    -
    5265 this->part1.interval ?
    -
    5266 this->part1.interval.size() <= 12 :
    -
    5267 false;
    -
    5268 else if (this->model[0] == '0' && this->model[1] == '1')
    -
    5269 is_valid =
    -
    5270 this->part3.interval ?
    -
    5271 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5272 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5273 check11(
    -
    5274 text + this->part1.interval.start, this->part1.interval.size(),
    -
    5275 text + this->part2.interval.start, this->part2.interval.size(),
    -
    5276 text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5277 this->part2.interval ?
    -
    5278 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5279 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5280 check11(
    -
    5281 text + this->part1.interval.start, this->part1.interval.size(),
    -
    5282 text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5283 this->part1.interval ?
    -
    5284 this->part1.interval.size() <= 12 &&
    -
    5285 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5286 false;
    -
    5287 else if (this->model[0] == '0' && this->model[1] == '2')
    -
    5288 is_valid =
    -
    5289 this->part3.interval ?
    -
    5290 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5291 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5292 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
    -
    5293 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5294 false;
    -
    5295 else if (this->model[0] == '0' && this->model[1] == '3')
    -
    5296 is_valid =
    -
    5297 this->part3.interval ?
    -
    5298 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5299 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5300 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5301 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
    -
    5302 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5303 false;
    -
    5304 else if (this->model[0] == '0' && this->model[1] == '4')
    -
    5305 is_valid =
    -
    5306 this->part3.interval ?
    -
    5307 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5308 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5309 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5310 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5311 false;
    -
    5312 else if ((this->model[0] == '0' || this->model[0] == '5') && this->model[1] == '5')
    -
    5313 is_valid =
    -
    5314 this->part3.interval ?
    -
    5315 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5316 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5317 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5318 this->part2.interval ?
    -
    5319 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5320 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5321 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5322 this->part1.interval ?
    -
    5323 this->part1.interval.size() <= 12 &&
    -
    5324 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5325 false;
    -
    5326 else if (this->model[0] == '0' && this->model[1] == '6')
    -
    5327 is_valid =
    -
    5328 this->part3.interval ?
    -
    5329 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5330 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5331 check11(
    -
    5332 text + this->part2.interval.start, this->part2.interval.size(),
    -
    5333 text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5334 this->part2.interval ?
    -
    5335 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5336 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5337 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5338 false;
    -
    5339 else if (this->model[0] == '0' && this->model[1] == '7')
    -
    5340 is_valid =
    -
    5341 this->part3.interval ?
    -
    5342 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5343 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5344 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5345 this->part2.interval ?
    -
    5346 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5347 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5348 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5349 false;
    -
    5350 else if (this->model[0] == '0' && this->model[1] == '8')
    -
    5351 is_valid =
    -
    5352 this->part3.interval ?
    -
    5353 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5354 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5355 check11(
    -
    5356 text + this->part1.interval.start, this->part1.interval.size(),
    -
    5357 text + this->part2.interval.start, this->part2.interval.size()) &&
    -
    5358 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5359 false;
    -
    5360 else if (this->model[0] == '0' && this->model[1] == '9')
    -
    5361 is_valid =
    -
    5362 this->part3.interval ?
    -
    5363 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5364 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5365 check11(
    -
    5366 text + this->part1.interval.start, this->part1.interval.size(),
    -
    5367 text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5368 this->part2.interval ?
    -
    5369 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5370 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5371 check11(
    -
    5372 text + this->part1.interval.start, this->part1.interval.size(),
    -
    5373 text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5374 this->part1.interval ?
    -
    5375 this->part1.interval.size() <= 12 &&
    -
    5376 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5377 false;
    -
    5378 else if (this->model[0] == '1' && this->model[1] == '0')
    -
    5379 is_valid =
    -
    5380 this->part3.interval ?
    -
    5381 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5382 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5383 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5384 check11(
    -
    5385 text + this->part2.interval.start, this->part2.interval.size(),
    -
    5386 text + this->part3.interval.start, this->part3.interval.size()) :
    -
    5387 this->part2.interval ?
    -
    5388 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5389 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5390 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5391 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5392 false;
    -
    5393 else if (
    -
    5394 (this->model[0] == '1' && (this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
    -
    5395 ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '8') ||
    -
    5396 (this->model[0] == '4' && (this->model[1] == '0' || this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
    -
    5397 (this->model[0] == '5' && (this->model[1] == '1' || this->model[1] == '8')))
    -
    5398 is_valid =
    -
    5399 this->part3.interval ?
    -
    5400 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    -
    5401 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    -
    5402 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5403 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5404 this->part2.interval ?
    -
    5405 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5406 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5407 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    -
    5408 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    -
    5409 false;
    -
    5410 else if (this->model[0] == '1' && this->model[1] == '2')
    -
    5411 is_valid =
    -
    5412 this->part3.interval ? false :
    -
    5413 this->part2.interval ? false :
    -
    5414 this->part1.interval ?
    -
    5415 this->part1.interval.size() <= 13 &&
    -
    5416 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5417 false;
    -
    5418 else if ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '1')
    -
    5419 is_valid =
    -
    5420 this->part3.interval ? false :
    -
    5421 this->part2.interval ?
    -
    5422 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    -
    5423 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    -
    5424 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    -
    5425 false;
    -
    5426 else
    -
    5427 is_valid = true; // Assume models we don't handle as valid
    -
    5428 return true;
    -
    5429
    -
    5430 error:
    -
    5431 invalidate();
    -
    5432 return false;
    -
    5433 }
    -
    5434
    -
    5435 static bool check11(
    -
    5436 _In_count_(num_part1) const T* part1, _In_ size_t num_part1)
    -
    5437 {
    -
    5438 _Assume_(part1 && num_part1 >= 1);
    -
    5439 uint32_t nominator = 0, ponder = 2;
    -
    5440 for (size_t i = num_part1 - 1; i--; ++ponder)
    -
    5441 nominator += (part1[i] - '0') * ponder;
    -
    5442 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    -
    5443 if (control >= 10)
    -
    5444 control = 0;
    -
    5445 return control == part1[num_part1 - 1] - '0';
    -
    5446 }
    -
    5447
    -
    5448 static bool check11(
    -
    5449 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
    -
    5450 _In_count_(num_part2) const T* part2, _In_ size_t num_part2)
    -
    5451 {
    -
    5452 _Assume_(part1 || !num_part1);
    -
    5453 _Assume_(part2 && num_part2 >= 1);
    -
    5454 uint32_t nominator = 0, ponder = 2;
    -
    5455 for (size_t i = num_part2 - 1; i--; ++ponder)
    -
    5456 nominator += (part2[i] - '0') * ponder;
    -
    5457 for (size_t i = num_part1; i--; ++ponder)
    -
    5458 nominator += (part1[i] - '0') * ponder;
    -
    5459 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    -
    5460 if (control == 10)
    -
    5461 control = 0;
    -
    5462 return control == part2[num_part2 - 1] - '0';
    -
    5463 }
    -
    5464
    -
    5465 static bool check11(
    -
    5466 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
    -
    5467 _In_count_(num_part2) const T* part2, _In_ size_t num_part2,
    -
    5468 _In_count_(num_part3) const T* part3, _In_ size_t num_part3)
    -
    5469 {
    -
    5470 _Assume_(part1 || !num_part1);
    -
    5471 _Assume_(part2 || !num_part2);
    -
    5472 _Assume_(part3 && num_part3 >= 1);
    -
    5473 uint32_t nominator = 0, ponder = 2;
    -
    5474 for (size_t i = num_part3 - 1; i--; ++ponder)
    -
    5475 nominator += (part3[i] - '0') * ponder;
    -
    5476 for (size_t i = num_part2; i--; ++ponder)
    -
    5477 nominator += (part2[i] - '0') * ponder;
    -
    5478 for (size_t i = num_part1; i--; ++ponder)
    -
    5479 nominator += (part1[i] - '0') * ponder;
    -
    5480 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    -
    5481 if (control == 10)
    -
    5482 control = 0;
    -
    5483 return control == part2[num_part3 - 1] - '0';
    -
    5484 }
    -
    5485
    -
    5486 std::shared_ptr<basic_parser<T>> m_space;
    -
    5487 basic_si_reference_delimiter<T> m_delimiter;
    -
    5488 };
    +
    5154
    + + +
    5157#ifdef _UNICODE
    + +
    5159#else
    + +
    5161#endif
    + +
    5163
    +
    5171 template <class T>
    +
    + +
    5173 {
    +
    5174 public:
    + +
    5176 _In_ const std::shared_ptr<basic_parser<T>>& space,
    +
    5177 _In_ const std::locale& locale = std::locale()) :
    + +
    5179 part1(locale),
    +
    5180 part2(locale),
    +
    5181 part3(locale),
    +
    5182 is_valid(false),
    +
    5183 m_space(space),
    +
    5184 m_delimiter(locale)
    +
    5185 {
    +
    5186 this->model[0] = 0;
    +
    5187 }
    +
    5188
    +
    5189 virtual void invalidate()
    +
    5190 {
    +
    5191 this->model[0] = 0;
    +
    5192 this->part1.invalidate();
    +
    5193 this->part2.invalidate();
    +
    5194 this->part3.invalidate();
    +
    5195 this->is_valid = false;
    + +
    5197 }
    +
    5198
    +
    5199 T model[3];
    + + + + +
    5204
    +
    5205 protected:
    +
    5206 virtual bool do_match(
    +
    5207 _In_reads_or_z_opt_(end) const T* text,
    +
    5208 _In_ size_t start = 0,
    +
    5209 _In_ size_t end = SIZE_MAX,
    +
    5210 _In_ int flags = match_default)
    +
    5211 {
    +
    5212 _Assume_(text || start >= end);
    +
    5213 const auto& ctype = std::use_facet<std::ctype<T>>(this->m_locale);
    +
    5214 const bool case_insensitive = flags & match_case_insensitive ? true : false;
    +
    5215
    +
    5216 this->interval.end = start;
    +
    5217 if (this->interval.end + 1 >= end ||
    +
    5218 (case_insensitive ? ctype.toupper(text[this->interval.end]) : text[this->interval.end]) != 'S' ||
    +
    5219 (case_insensitive ? ctype.toupper(text[this->interval.end + 1]) : text[this->interval.end + 1]) != 'I')
    +
    5220 goto error; // incomplete or wrong reference ID
    +
    5221 this->interval.end += 2;
    +
    5222
    +
    5223 for (size_t i = 0; i < 2; ++i, ++this->interval.end) {
    +
    5224 if (this->interval.end >= end || text[this->interval.end] < '0' || '9' < text[this->interval.end])
    +
    5225 goto error; // incomplete or invalid model
    +
    5226 this->model[i] = text[this->interval.end];
    +
    5227 }
    +
    5228 this->model[2] = 0;
    +
    5229
    +
    5230 this->part1.invalidate();
    +
    5231 this->part2.invalidate();
    +
    5232 this->part3.invalidate();
    +
    5233 if (this->model[0] == '9' && this->model[1] == '9') {
    +
    5234 is_valid = true;
    +
    5235 this->interval.start = start;
    +
    5236 return true;
    +
    5237 }
    +
    5238
    +
    5239 if (m_space && m_space->match(text, this->interval.end, end, flags))
    +
    5240 this->interval.end = m_space->interval.end;
    +
    5241
    +
    5242 this->part1.match(text, this->interval.end, end, flags) &&
    +
    5243 this->m_delimiter.match(text, this->part1.interval.end, end, flags) &&
    +
    5244 this->part2.match(text, this->m_delimiter.interval.end, end, flags) &&
    +
    5245 this->m_delimiter.match(text, this->part2.interval.end, end, flags) &&
    +
    5246 this->part3.match(text, this->m_delimiter.interval.end, end, flags);
    +
    5247
    +
    5248 this->interval.start = start;
    +
    5249 if (this->part3.interval)
    +
    5250 this->interval.end = this->part3.interval.end;
    +
    5251 else if (this->part2.interval)
    +
    5252 this->interval.end = this->part2.interval.end;
    +
    5253 else if (this->part1.interval)
    +
    5254 this->interval.end = this->part1.interval.end;
    +
    5255 else
    +
    5256 this->interval.end = start + 4;
    +
    5257
    +
    5258 if (this->model[0] == '0' && this->model[1] == '0')
    +
    5259 is_valid =
    +
    5260 this->part3.interval ?
    +
    5261 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5262 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 :
    +
    5263 this->part2.interval ?
    +
    5264 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5265 this->part1.interval.size() + this->part2.interval.size() <= 20 :
    +
    5266 this->part1.interval ?
    +
    5267 this->part1.interval.size() <= 12 :
    +
    5268 false;
    +
    5269 else if (this->model[0] == '0' && this->model[1] == '1')
    +
    5270 is_valid =
    +
    5271 this->part3.interval ?
    +
    5272 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5273 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5274 check11(
    +
    5275 text + this->part1.interval.start, this->part1.interval.size(),
    +
    5276 text + this->part2.interval.start, this->part2.interval.size(),
    +
    5277 text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5278 this->part2.interval ?
    +
    5279 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5280 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5281 check11(
    +
    5282 text + this->part1.interval.start, this->part1.interval.size(),
    +
    5283 text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5284 this->part1.interval ?
    +
    5285 this->part1.interval.size() <= 12 &&
    +
    5286 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5287 false;
    +
    5288 else if (this->model[0] == '0' && this->model[1] == '2')
    +
    5289 is_valid =
    +
    5290 this->part3.interval ?
    +
    5291 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5292 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5293 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
    +
    5294 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5295 false;
    +
    5296 else if (this->model[0] == '0' && this->model[1] == '3')
    +
    5297 is_valid =
    +
    5298 this->part3.interval ?
    +
    5299 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5300 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5301 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5302 check11(text + this->part2.interval.start, this->part2.interval.size()) &&
    +
    5303 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5304 false;
    +
    5305 else if (this->model[0] == '0' && this->model[1] == '4')
    +
    5306 is_valid =
    +
    5307 this->part3.interval ?
    +
    5308 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5309 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5310 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5311 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5312 false;
    +
    5313 else if ((this->model[0] == '0' || this->model[0] == '5') && this->model[1] == '5')
    +
    5314 is_valid =
    +
    5315 this->part3.interval ?
    +
    5316 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5317 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5318 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5319 this->part2.interval ?
    +
    5320 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5321 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5322 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5323 this->part1.interval ?
    +
    5324 this->part1.interval.size() <= 12 &&
    +
    5325 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5326 false;
    +
    5327 else if (this->model[0] == '0' && this->model[1] == '6')
    +
    5328 is_valid =
    +
    5329 this->part3.interval ?
    +
    5330 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5331 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5332 check11(
    +
    5333 text + this->part2.interval.start, this->part2.interval.size(),
    +
    5334 text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5335 this->part2.interval ?
    +
    5336 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5337 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5338 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5339 false;
    +
    5340 else if (this->model[0] == '0' && this->model[1] == '7')
    +
    5341 is_valid =
    +
    5342 this->part3.interval ?
    +
    5343 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5344 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5345 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5346 this->part2.interval ?
    +
    5347 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5348 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5349 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5350 false;
    +
    5351 else if (this->model[0] == '0' && this->model[1] == '8')
    +
    5352 is_valid =
    +
    5353 this->part3.interval ?
    +
    5354 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5355 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5356 check11(
    +
    5357 text + this->part1.interval.start, this->part1.interval.size(),
    +
    5358 text + this->part2.interval.start, this->part2.interval.size()) &&
    +
    5359 check11(text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5360 false;
    +
    5361 else if (this->model[0] == '0' && this->model[1] == '9')
    +
    5362 is_valid =
    +
    5363 this->part3.interval ?
    +
    5364 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5365 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5366 check11(
    +
    5367 text + this->part1.interval.start, this->part1.interval.size(),
    +
    5368 text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5369 this->part2.interval ?
    +
    5370 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5371 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5372 check11(
    +
    5373 text + this->part1.interval.start, this->part1.interval.size(),
    +
    5374 text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5375 this->part1.interval ?
    +
    5376 this->part1.interval.size() <= 12 &&
    +
    5377 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5378 false;
    +
    5379 else if (this->model[0] == '1' && this->model[1] == '0')
    +
    5380 is_valid =
    +
    5381 this->part3.interval ?
    +
    5382 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5383 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5384 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5385 check11(
    +
    5386 text + this->part2.interval.start, this->part2.interval.size(),
    +
    5387 text + this->part3.interval.start, this->part3.interval.size()) :
    +
    5388 this->part2.interval ?
    +
    5389 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5390 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5391 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5392 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5393 false;
    +
    5394 else if (
    +
    5395 (this->model[0] == '1' && (this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
    +
    5396 ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '8') ||
    +
    5397 (this->model[0] == '4' && (this->model[1] == '0' || this->model[1] == '1' || this->model[1] == '8' || this->model[1] == '9')) ||
    +
    5398 (this->model[0] == '5' && (this->model[1] == '1' || this->model[1] == '8')))
    +
    5399 is_valid =
    +
    5400 this->part3.interval ?
    +
    5401 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 && this->part3.interval.size() <= 12 &&
    +
    5402 this->part1.interval.size() + this->part2.interval.size() + this->part3.interval.size() <= 20 &&
    +
    5403 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5404 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5405 this->part2.interval ?
    +
    5406 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5407 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5408 check11(text + this->part1.interval.start, this->part1.interval.size()) &&
    +
    5409 check11(text + this->part2.interval.start, this->part2.interval.size()) :
    +
    5410 false;
    +
    5411 else if (this->model[0] == '1' && this->model[1] == '2')
    +
    5412 is_valid =
    +
    5413 this->part3.interval ? false :
    +
    5414 this->part2.interval ? false :
    +
    5415 this->part1.interval ?
    +
    5416 this->part1.interval.size() <= 13 &&
    +
    5417 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5418 false;
    +
    5419 else if ((this->model[0] == '2' || this->model[0] == '3') && this->model[1] == '1')
    +
    5420 is_valid =
    +
    5421 this->part3.interval ? false :
    +
    5422 this->part2.interval ?
    +
    5423 this->part1.interval.size() <= 12 && this->part2.interval.size() <= 12 &&
    +
    5424 this->part1.interval.size() + this->part2.interval.size() <= 20 &&
    +
    5425 check11(text + this->part1.interval.start, this->part1.interval.size()) :
    +
    5426 false;
    +
    5427 else
    +
    5428 is_valid = true; // Assume models we don't handle as valid
    +
    5429 return true;
    +
    5430
    +
    5431 error:
    +
    5432 invalidate();
    +
    5433 return false;
    +
    5434 }
    +
    5435
    +
    5436 static bool check11(
    +
    5437 _In_count_(num_part1) const T* part1, _In_ size_t num_part1)
    +
    5438 {
    +
    5439 _Assume_(part1 && num_part1 >= 1);
    +
    5440 uint32_t nominator = 0, ponder = 2;
    +
    5441 for (size_t i = num_part1 - 1; i--; ++ponder)
    +
    5442 nominator += (part1[i] - '0') * ponder;
    +
    5443 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    +
    5444 if (control >= 10)
    +
    5445 control = 0;
    +
    5446 return control == part1[num_part1 - 1] - '0';
    +
    5447 }
    +
    5448
    +
    5449 static bool check11(
    +
    5450 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
    +
    5451 _In_count_(num_part2) const T* part2, _In_ size_t num_part2)
    +
    5452 {
    +
    5453 _Assume_(part1 || !num_part1);
    +
    5454 _Assume_(part2 && num_part2 >= 1);
    +
    5455 uint32_t nominator = 0, ponder = 2;
    +
    5456 for (size_t i = num_part2 - 1; i--; ++ponder)
    +
    5457 nominator += (part2[i] - '0') * ponder;
    +
    5458 for (size_t i = num_part1; i--; ++ponder)
    +
    5459 nominator += (part1[i] - '0') * ponder;
    +
    5460 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    +
    5461 if (control == 10)
    +
    5462 control = 0;
    +
    5463 return control == part2[num_part2 - 1] - '0';
    +
    5464 }
    +
    5465
    +
    5466 static bool check11(
    +
    5467 _In_count_(num_part1) const T* part1, _In_ size_t num_part1,
    +
    5468 _In_count_(num_part2) const T* part2, _In_ size_t num_part2,
    +
    5469 _In_count_(num_part3) const T* part3, _In_ size_t num_part3)
    +
    5470 {
    +
    5471 _Assume_(part1 || !num_part1);
    +
    5472 _Assume_(part2 || !num_part2);
    +
    5473 _Assume_(part3 && num_part3 >= 1);
    +
    5474 uint32_t nominator = 0, ponder = 2;
    +
    5475 for (size_t i = num_part3 - 1; i--; ++ponder)
    +
    5476 nominator += (part3[i] - '0') * ponder;
    +
    5477 for (size_t i = num_part2; i--; ++ponder)
    +
    5478 nominator += (part2[i] - '0') * ponder;
    +
    5479 for (size_t i = num_part1; i--; ++ponder)
    +
    5480 nominator += (part1[i] - '0') * ponder;
    +
    5481 uint8_t control = 11 - static_cast<uint8_t>(nominator % 11);
    +
    5482 if (control == 10)
    +
    5483 control = 0;
    +
    5484 return control == part2[num_part3 - 1] - '0';
    +
    5485 }
    +
    5486
    +
    5487 std::shared_ptr<basic_parser<T>> m_space;
    +
    5488 basic_si_reference_delimiter<T> m_delimiter;
    +
    5489 };
    -
    5489
    -
    5490 using si_reference = basic_si_reference<char>;
    -
    5491 using wsi_reference = basic_si_reference<wchar_t>;
    -
    5492#ifdef _UNICODE
    -
    5493 using tsi_reference = wsi_reference;
    -
    5494#else
    -
    5495 using tsi_reference = si_reference;
    -
    5496#endif
    -
    5497 using sgml_si_reference = basic_si_reference<char>;
    -
    5498
    -
    5502 template <class T>
    -
    - -
    5504 {
    -
    5505 public:
    - -
    5507 _In_ const std::shared_ptr<basic_parser<T>>& element,
    -
    5508 _In_ const std::shared_ptr<basic_parser<T>>& digit,
    -
    5509 _In_ const std::shared_ptr<basic_parser<T>>& sign,
    -
    5510 _In_ const std::locale& locale = std::locale()) :
    - -
    5512 m_element(element),
    -
    5513 m_digit(digit),
    -
    5514 m_sign(sign),
    -
    5515 has_digits(false),
    -
    5516 has_charge(false)
    -
    5517 {}
    -
    5518
    -
    5519 virtual void invalidate()
    -
    5520 {
    -
    5521 has_digits = false;
    -
    5522 has_charge = false;
    - -
    5524 }
    -
    5525
    -
    5526 bool has_digits;
    -
    5527 bool has_charge;
    -
    5528
    -
    5529 protected:
    -
    5530 virtual bool do_match(
    -
    5531 _In_reads_or_z_opt_(end) const T* text,
    -
    5532 _In_ size_t start = 0,
    -
    5533 _In_ size_t end = SIZE_MAX,
    -
    5534 _In_ int flags = match_default)
    -
    5535 {
    -
    5536 _Assume_(text || start >= end);
    -
    5537
    -
    5538 has_digits = false;
    -
    5539 has_charge = false;
    -
    5540 this->interval.end = start;
    -
    5541
    -
    5542 const int element_match_flags = flags & ~match_case_insensitive; // Chemical elements are always case-sensitive.
    -
    5543 for (;;) {
    -
    5544 if (m_element->match(text, this->interval.end, end, element_match_flags)) {
    -
    5545 this->interval.end = m_element->interval.end;
    -
    5546 while (m_digit->match(text, this->interval.end, end, flags)) {
    -
    5547 this->interval.end = m_digit->interval.end;
    -
    5548 has_digits = true;
    -
    5549 }
    -
    5550 }
    -
    5551 else if (start < this->interval.end) {
    -
    5552 if (m_sign->match(text, this->interval.end, end, flags)) {
    -
    5553 this->interval.end = m_sign->interval.end;
    -
    5554 has_charge = true;
    -
    5555 }
    -
    5556 this->interval.start = start;
    -
    5557 return true;
    -
    5558 }
    -
    5559 else {
    -
    5560 this->interval.invalidate();
    -
    5561 return false;
    -
    5562 }
    -
    5563 }
    -
    5564 }
    -
    5565
    -
    5566 std::shared_ptr<basic_parser<T>> m_element;
    -
    5567 std::shared_ptr<basic_parser<T>> m_digit;
    -
    5568 std::shared_ptr<basic_parser<T>> m_sign;
    -
    5569 };
    +
    5490
    +
    5491 using si_reference = basic_si_reference<char>;
    +
    5492 using wsi_reference = basic_si_reference<wchar_t>;
    +
    5493#ifdef _UNICODE
    +
    5494 using tsi_reference = wsi_reference;
    +
    5495#else
    +
    5496 using tsi_reference = si_reference;
    +
    5497#endif
    +
    5498 using sgml_si_reference = basic_si_reference<char>;
    +
    5499
    +
    5503 template <class T>
    +
    + +
    5505 {
    +
    5506 public:
    + +
    5508 _In_ const std::shared_ptr<basic_parser<T>>& element,
    +
    5509 _In_ const std::shared_ptr<basic_parser<T>>& digit,
    +
    5510 _In_ const std::shared_ptr<basic_parser<T>>& sign,
    +
    5511 _In_ const std::locale& locale = std::locale()) :
    + +
    5513 m_element(element),
    +
    5514 m_digit(digit),
    +
    5515 m_sign(sign),
    +
    5516 has_digits(false),
    +
    5517 has_charge(false)
    +
    5518 {}
    +
    5519
    +
    5520 virtual void invalidate()
    +
    5521 {
    +
    5522 has_digits = false;
    +
    5523 has_charge = false;
    + +
    5525 }
    +
    5526
    +
    5527 bool has_digits;
    +
    5528 bool has_charge;
    +
    5529
    +
    5530 protected:
    +
    5531 virtual bool do_match(
    +
    5532 _In_reads_or_z_opt_(end) const T* text,
    +
    5533 _In_ size_t start = 0,
    +
    5534 _In_ size_t end = SIZE_MAX,
    +
    5535 _In_ int flags = match_default)
    +
    5536 {
    +
    5537 _Assume_(text || start >= end);
    +
    5538
    +
    5539 has_digits = false;
    +
    5540 has_charge = false;
    +
    5541 this->interval.end = start;
    +
    5542
    +
    5543 const int element_match_flags = flags & ~match_case_insensitive; // Chemical elements are always case-sensitive.
    +
    5544 for (;;) {
    +
    5545 if (m_element->match(text, this->interval.end, end, element_match_flags)) {
    +
    5546 this->interval.end = m_element->interval.end;
    +
    5547 while (m_digit->match(text, this->interval.end, end, flags)) {
    +
    5548 this->interval.end = m_digit->interval.end;
    +
    5549 has_digits = true;
    +
    5550 }
    +
    5551 }
    +
    5552 else if (start < this->interval.end) {
    +
    5553 if (m_sign->match(text, this->interval.end, end, flags)) {
    +
    5554 this->interval.end = m_sign->interval.end;
    +
    5555 has_charge = true;
    +
    5556 }
    +
    5557 this->interval.start = start;
    +
    5558 return true;
    +
    5559 }
    +
    5560 else {
    +
    5561 this->interval.invalidate();
    +
    5562 return false;
    +
    5563 }
    +
    5564 }
    +
    5565 }
    +
    5566
    +
    5567 std::shared_ptr<basic_parser<T>> m_element;
    +
    5568 std::shared_ptr<basic_parser<T>> m_digit;
    +
    5569 std::shared_ptr<basic_parser<T>> m_sign;
    +
    5570 };
    -
    5570
    - - -
    5573#ifdef _UNICODE
    - -
    5575#else
    - -
    5577#endif
    - -
    5579
    -
    - -
    5584 {
    -
    5585 protected:
    -
    5586 virtual bool do_match(
    -
    5587 _In_reads_or_z_(end) const char* text,
    -
    5588 _In_ size_t start = 0,
    -
    5589 _In_ size_t end = SIZE_MAX,
    -
    5590 _In_ int flags = match_default)
    -
    5591 {
    -
    5592 _Assume_(text || start >= end);
    -
    5593 this->interval.end = start;
    -
    5594
    -
    5595 _Assume_(text || this->interval.end >= end);
    -
    5596 if (this->interval.end < end && text[this->interval.end]) {
    -
    5597 if (text[this->interval.end] == '\r') {
    -
    5598 this->interval.end++;
    -
    5599 if (this->interval.end < end && text[this->interval.end] == '\n') {
    -
    5600 this->interval.start = start;
    -
    5601 this->interval.end++;
    -
    5602 return true;
    -
    5603 }
    -
    5604 }
    -
    5605 else if (text[this->interval.end] == '\n') {
    -
    5606 this->interval.start = start;
    -
    5607 this->interval.end++;
    -
    5608 return true;
    -
    5609 }
    -
    5610 }
    -
    5611 this->interval.invalidate();
    -
    5612 return false;
    -
    5613 }
    -
    5614 };
    +
    5571
    + + +
    5574#ifdef _UNICODE
    + +
    5576#else
    + +
    5578#endif
    + +
    5580
    +
    + +
    5585 {
    +
    5586 protected:
    +
    5587 virtual bool do_match(
    +
    5588 _In_reads_or_z_(end) const char* text,
    +
    5589 _In_ size_t start = 0,
    +
    5590 _In_ size_t end = SIZE_MAX,
    +
    5591 _In_ int flags = match_default)
    +
    5592 {
    +
    5593 _Assume_(text || start >= end);
    +
    5594 this->interval.end = start;
    +
    5595
    +
    5596 _Assume_(text || this->interval.end >= end);
    +
    5597 if (this->interval.end < end && text[this->interval.end]) {
    +
    5598 if (text[this->interval.end] == '\r') {
    +
    5599 this->interval.end++;
    +
    5600 if (this->interval.end < end && text[this->interval.end] == '\n') {
    +
    5601 this->interval.start = start;
    +
    5602 this->interval.end++;
    +
    5603 return true;
    +
    5604 }
    +
    5605 }
    +
    5606 else if (text[this->interval.end] == '\n') {
    +
    5607 this->interval.start = start;
    +
    5608 this->interval.end++;
    +
    5609 return true;
    +
    5610 }
    +
    5611 }
    +
    5612 this->interval.invalidate();
    +
    5613 return false;
    +
    5614 }
    +
    5615 };
    -
    5615
    -
    -
    5619 class http_space : public parser
    -
    5620 {
    -
    5621 protected:
    -
    5622 virtual bool do_match(
    -
    5623 _In_reads_or_z_(end) const char* text,
    -
    5624 _In_ size_t start = 0,
    -
    5625 _In_ size_t end = SIZE_MAX,
    -
    5626 _In_ int flags = match_default)
    -
    5627 {
    -
    5628 _Assume_(text || start >= end);
    -
    5629 this->interval.end = start;
    -
    5630 if (m_line_break.match(text, this->interval.end, end, flags)) {
    -
    5631 this->interval.end = m_line_break.interval.end;
    -
    5632 if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
    -
    5633 this->interval.start = start;
    -
    5634 this->interval.end++;
    -
    5635 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    5636 return true;
    -
    5637 }
    -
    5638 }
    -
    5639 else if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
    -
    5640 this->interval.start = start;
    -
    5641 this->interval.end++;
    -
    5642 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    5643 return true;
    -
    5644 }
    -
    5645 this->interval.invalidate();
    -
    5646 return false;
    -
    5647 }
    -
    5648
    -
    5649 http_line_break m_line_break;
    -
    5650 };
    +
    5616
    +
    +
    5620 class http_space : public parser
    +
    5621 {
    +
    5622 protected:
    +
    5623 virtual bool do_match(
    +
    5624 _In_reads_or_z_(end) const char* text,
    +
    5625 _In_ size_t start = 0,
    +
    5626 _In_ size_t end = SIZE_MAX,
    +
    5627 _In_ int flags = match_default)
    +
    5628 {
    +
    5629 _Assume_(text || start >= end);
    +
    5630 this->interval.end = start;
    +
    5631 if (m_line_break.match(text, this->interval.end, end, flags)) {
    +
    5632 this->interval.end = m_line_break.interval.end;
    +
    5633 if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
    +
    5634 this->interval.start = start;
    +
    5635 this->interval.end++;
    +
    5636 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    5637 return true;
    +
    5638 }
    +
    5639 }
    +
    5640 else if (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) {
    +
    5641 this->interval.start = start;
    +
    5642 this->interval.end++;
    +
    5643 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    5644 return true;
    +
    5645 }
    +
    5646 this->interval.invalidate();
    +
    5647 return false;
    +
    5648 }
    +
    5649
    +
    5650 http_line_break m_line_break;
    +
    5651 };
    -
    5651
    -
    -
    5655 class http_text_char : public parser
    -
    5656 {
    -
    5657 protected:
    -
    5658 virtual bool do_match(
    -
    5659 _In_reads_or_z_(end) const char* text,
    -
    5660 _In_ size_t start = 0,
    -
    5661 _In_ size_t end = SIZE_MAX,
    -
    5662 _In_ int flags = match_default)
    -
    5663 {
    -
    5664 _Assume_(text || start >= end);
    -
    5665 this->interval.end = start;
    -
    5666
    -
    5667 _Assume_(text || this->interval.end >= end);
    -
    5668 if (m_space.match(text, this->interval.end, end, flags)) {
    -
    5669 this->interval.start = start;
    -
    5670 this->interval.end = m_space.interval.end;
    -
    5671 return true;
    -
    5672 }
    -
    5673 else if (this->interval.end < end && text[this->interval.end] && text[this->interval.end] >= 0x20) {
    -
    5674 this->interval.start = start;
    -
    5675 this->interval.end++;
    -
    5676 return true;
    -
    5677 }
    -
    5678 this->interval.invalidate();
    -
    5679 return false;
    -
    5680 }
    -
    5681
    -
    5682 http_space m_space;
    -
    5683 };
    +
    5652
    +
    +
    5656 class http_text_char : public parser
    +
    5657 {
    +
    5658 protected:
    +
    5659 virtual bool do_match(
    +
    5660 _In_reads_or_z_(end) const char* text,
    +
    5661 _In_ size_t start = 0,
    +
    5662 _In_ size_t end = SIZE_MAX,
    +
    5663 _In_ int flags = match_default)
    +
    5664 {
    +
    5665 _Assume_(text || start >= end);
    +
    5666 this->interval.end = start;
    +
    5667
    +
    5668 _Assume_(text || this->interval.end >= end);
    +
    5669 if (m_space.match(text, this->interval.end, end, flags)) {
    +
    5670 this->interval.start = start;
    +
    5671 this->interval.end = m_space.interval.end;
    +
    5672 return true;
    +
    5673 }
    +
    5674 else if (this->interval.end < end && text[this->interval.end] && text[this->interval.end] >= 0x20) {
    +
    5675 this->interval.start = start;
    +
    5676 this->interval.end++;
    +
    5677 return true;
    +
    5678 }
    +
    5679 this->interval.invalidate();
    +
    5680 return false;
    +
    5681 }
    +
    5682
    +
    5683 http_space m_space;
    +
    5684 };
    -
    5684
    -
    -
    5688 class http_token : public parser
    -
    5689 {
    -
    5690 protected:
    -
    5691 virtual bool do_match(
    -
    5692 _In_reads_or_z_(end) const char* text,
    -
    5693 _In_ size_t start = 0,
    -
    5694 _In_ size_t end = SIZE_MAX,
    -
    5695 _In_ int flags = match_default)
    -
    5696 {
    -
    5697 _Assume_(text || start >= end);
    -
    5698 this->interval.end = start;
    -
    5699 for (;;) {
    -
    5700 if (this->interval.end < end && text[this->interval.end]) {
    -
    5701 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    5702 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    5703 text[this->interval.end] == '(' ||
    -
    5704 text[this->interval.end] == ')' ||
    -
    5705 text[this->interval.end] == '<' ||
    -
    5706 text[this->interval.end] == '>' ||
    -
    5707 text[this->interval.end] == '@' ||
    -
    5708 text[this->interval.end] == ',' ||
    -
    5709 text[this->interval.end] == ';' ||
    -
    5710 text[this->interval.end] == ':' ||
    -
    5711 text[this->interval.end] == '\\' ||
    -
    5712 text[this->interval.end] == '\"' ||
    -
    5713 text[this->interval.end] == '/' ||
    -
    5714 text[this->interval.end] == '[' ||
    -
    5715 text[this->interval.end] == ']' ||
    -
    5716 text[this->interval.end] == '?' ||
    -
    5717 text[this->interval.end] == '=' ||
    -
    5718 text[this->interval.end] == '{' ||
    -
    5719 text[this->interval.end] == '}' ||
    -
    5720 stdex::isspace(text[this->interval.end]))
    -
    5721 break;
    -
    5722 else
    -
    5723 this->interval.end++;
    -
    5724 }
    -
    5725 else
    -
    5726 break;
    -
    5727 }
    - -
    5729 this->interval.start = start;
    -
    5730 return true;
    -
    5731 }
    -
    5732 else {
    -
    5733 this->interval.invalidate();
    -
    5734 return false;
    -
    5735 }
    -
    5736 }
    -
    5737 };
    +
    5685
    +
    +
    5689 class http_token : public parser
    +
    5690 {
    +
    5691 protected:
    +
    5692 virtual bool do_match(
    +
    5693 _In_reads_or_z_(end) const char* text,
    +
    5694 _In_ size_t start = 0,
    +
    5695 _In_ size_t end = SIZE_MAX,
    +
    5696 _In_ int flags = match_default)
    +
    5697 {
    +
    5698 _Assume_(text || start >= end);
    +
    5699 this->interval.end = start;
    +
    5700 for (;;) {
    +
    5701 if (this->interval.end < end && text[this->interval.end]) {
    +
    5702 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    5703 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    5704 text[this->interval.end] == '(' ||
    +
    5705 text[this->interval.end] == ')' ||
    +
    5706 text[this->interval.end] == '<' ||
    +
    5707 text[this->interval.end] == '>' ||
    +
    5708 text[this->interval.end] == '@' ||
    +
    5709 text[this->interval.end] == ',' ||
    +
    5710 text[this->interval.end] == ';' ||
    +
    5711 text[this->interval.end] == ':' ||
    +
    5712 text[this->interval.end] == '\\' ||
    +
    5713 text[this->interval.end] == '\"' ||
    +
    5714 text[this->interval.end] == '/' ||
    +
    5715 text[this->interval.end] == '[' ||
    +
    5716 text[this->interval.end] == ']' ||
    +
    5717 text[this->interval.end] == '?' ||
    +
    5718 text[this->interval.end] == '=' ||
    +
    5719 text[this->interval.end] == '{' ||
    +
    5720 text[this->interval.end] == '}' ||
    +
    5721 stdex::isspace(text[this->interval.end]))
    +
    5722 break;
    +
    5723 else
    +
    5724 this->interval.end++;
    +
    5725 }
    +
    5726 else
    +
    5727 break;
    +
    5728 }
    + +
    5730 this->interval.start = start;
    +
    5731 return true;
    +
    5732 }
    +
    5733 else {
    +
    5734 this->interval.invalidate();
    +
    5735 return false;
    +
    5736 }
    +
    5737 }
    +
    5738 };
    -
    5738
    -
    - -
    5743 {
    -
    5744 public:
    -
    5745 virtual void invalidate()
    -
    5746 {
    -
    5747 content.start = 1;
    -
    5748 content.end = 0;
    -
    5749 parser::invalidate();
    -
    5750 }
    -
    5751
    - -
    5753
    -
    5754 protected:
    -
    5755 virtual bool do_match(
    -
    5756 _In_reads_or_z_(end) const char* text,
    -
    5757 _In_ size_t start = 0,
    -
    5758 _In_ size_t end = SIZE_MAX,
    -
    5759 _In_ int flags = match_default)
    -
    5760 {
    -
    5761 _Assume_(text || start >= end);
    -
    5762 this->interval.end = start;
    -
    5763 if (this->interval.end < end && text[this->interval.end] != '"')
    -
    5764 goto error;
    -
    5765 this->interval.end++;
    -
    5766 content.start = this->interval.end;
    -
    5767 for (;;) {
    -
    5768 _Assume_(text || this->interval.end >= end);
    -
    5769 if (this->interval.end < end && text[this->interval.end]) {
    -
    5770 if (text[this->interval.end] == '"') {
    -
    5771 content.end = this->interval.end;
    -
    5772 this->interval.end++;
    -
    5773 break;
    -
    5774 }
    -
    5775 else if (text[this->interval.end] == '\\') {
    -
    5776 this->interval.end++;
    -
    5777 if (this->interval.end < end && text[this->interval.end]) {
    -
    5778 this->interval.end++;
    -
    5779 }
    -
    5780 else
    -
    5781 goto error;
    -
    5782 }
    -
    5783 else if (m_chr.match(text, this->interval.end, end, flags))
    -
    5784 this->interval.end++;
    -
    5785 else
    -
    5786 goto error;
    -
    5787 }
    -
    5788 else
    -
    5789 goto error;
    -
    5790 }
    -
    5791 this->interval.start = start;
    -
    5792 return true;
    -
    5793
    -
    5794 error:
    -
    5795 invalidate();
    -
    5796 return false;
    -
    5797 }
    -
    5798
    -
    5799 http_text_char m_chr;
    -
    5800 };
    +
    5739
    +
    + +
    5744 {
    +
    5745 public:
    +
    5746 virtual void invalidate()
    +
    5747 {
    +
    5748 content.start = 1;
    +
    5749 content.end = 0;
    +
    5750 parser::invalidate();
    +
    5751 }
    +
    5752
    + +
    5754
    +
    5755 protected:
    +
    5756 virtual bool do_match(
    +
    5757 _In_reads_or_z_(end) const char* text,
    +
    5758 _In_ size_t start = 0,
    +
    5759 _In_ size_t end = SIZE_MAX,
    +
    5760 _In_ int flags = match_default)
    +
    5761 {
    +
    5762 _Assume_(text || start >= end);
    +
    5763 this->interval.end = start;
    +
    5764 if (this->interval.end < end && text[this->interval.end] != '"')
    +
    5765 goto error;
    +
    5766 this->interval.end++;
    +
    5767 content.start = this->interval.end;
    +
    5768 for (;;) {
    +
    5769 _Assume_(text || this->interval.end >= end);
    +
    5770 if (this->interval.end < end && text[this->interval.end]) {
    +
    5771 if (text[this->interval.end] == '"') {
    +
    5772 content.end = this->interval.end;
    +
    5773 this->interval.end++;
    +
    5774 break;
    +
    5775 }
    +
    5776 else if (text[this->interval.end] == '\\') {
    +
    5777 this->interval.end++;
    +
    5778 if (this->interval.end < end && text[this->interval.end]) {
    +
    5779 this->interval.end++;
    +
    5780 }
    +
    5781 else
    +
    5782 goto error;
    +
    5783 }
    +
    5784 else if (m_chr.match(text, this->interval.end, end, flags))
    +
    5785 this->interval.end++;
    +
    5786 else
    +
    5787 goto error;
    +
    5788 }
    +
    5789 else
    +
    5790 goto error;
    +
    5791 }
    +
    5792 this->interval.start = start;
    +
    5793 return true;
    +
    5794
    +
    5795 error:
    +
    5796 invalidate();
    +
    5797 return false;
    +
    5798 }
    +
    5799
    +
    5800 http_text_char m_chr;
    +
    5801 };
    -
    5801
    -
    -
    5805 class http_value : public parser
    -
    5806 {
    -
    5807 public:
    -
    5808 virtual void invalidate()
    -
    5809 {
    -
    5810 string.invalidate();
    -
    5811 token.invalidate();
    -
    5812 parser::invalidate();
    -
    5813 }
    -
    5814
    - - -
    5817
    -
    5818 protected:
    -
    5819 virtual bool do_match(
    -
    5820 _In_reads_or_z_(end) const char* text,
    -
    5821 _In_ size_t start = 0,
    -
    5822 _In_ size_t end = SIZE_MAX,
    -
    5823 _In_ int flags = match_default)
    -
    5824 {
    -
    5825 _Assume_(text || start >= end);
    -
    5826 this->interval.end = start;
    -
    5827 if (string.match(text, this->interval.end, end, flags)) {
    -
    5828 token.invalidate();
    -
    5829 this->interval.end = string.interval.end;
    -
    5830 this->interval.start = start;
    -
    5831 return true;
    -
    5832 }
    -
    5833 else if (token.match(text, this->interval.end, end, flags)) {
    -
    5834 string.invalidate();
    -
    5835 this->interval.end = token.interval.end;
    -
    5836 this->interval.start = start;
    -
    5837 return true;
    -
    5838 }
    -
    5839 else {
    -
    5840 this->interval.invalidate();
    -
    5841 return false;
    -
    5842 }
    -
    5843 }
    -
    5844 };
    +
    5802
    +
    +
    5806 class http_value : public parser
    +
    5807 {
    +
    5808 public:
    +
    5809 virtual void invalidate()
    +
    5810 {
    +
    5811 string.invalidate();
    +
    5812 token.invalidate();
    +
    5813 parser::invalidate();
    +
    5814 }
    +
    5815
    + + +
    5818
    +
    5819 protected:
    +
    5820 virtual bool do_match(
    +
    5821 _In_reads_or_z_(end) const char* text,
    +
    5822 _In_ size_t start = 0,
    +
    5823 _In_ size_t end = SIZE_MAX,
    +
    5824 _In_ int flags = match_default)
    +
    5825 {
    +
    5826 _Assume_(text || start >= end);
    +
    5827 this->interval.end = start;
    +
    5828 if (string.match(text, this->interval.end, end, flags)) {
    +
    5829 token.invalidate();
    +
    5830 this->interval.end = string.interval.end;
    +
    5831 this->interval.start = start;
    +
    5832 return true;
    +
    5833 }
    +
    5834 else if (token.match(text, this->interval.end, end, flags)) {
    +
    5835 string.invalidate();
    +
    5836 this->interval.end = token.interval.end;
    +
    5837 this->interval.start = start;
    +
    5838 return true;
    +
    5839 }
    +
    5840 else {
    +
    5841 this->interval.invalidate();
    +
    5842 return false;
    +
    5843 }
    +
    5844 }
    +
    5845 };
    -
    5845
    -
    -
    5849 class http_parameter : public parser
    -
    5850 {
    -
    5851 public:
    -
    5852 virtual void invalidate()
    -
    5853 {
    -
    5854 name.invalidate();
    -
    5855 value.invalidate();
    -
    5856 parser::invalidate();
    -
    5857 }
    -
    5858
    - - -
    5861
    -
    5862 protected:
    -
    5863 virtual bool do_match(
    -
    5864 _In_reads_or_z_(end) const char* text,
    -
    5865 _In_ size_t start = 0,
    -
    5866 _In_ size_t end = SIZE_MAX,
    -
    5867 _In_ int flags = match_default)
    -
    5868 {
    -
    5869 _Assume_(text || start >= end);
    -
    5870 this->interval.end = start;
    -
    5871 if (name.match(text, this->interval.end, end, flags))
    -
    5872 this->interval.end = name.interval.end;
    -
    5873 else
    -
    5874 goto error;
    -
    5875 while (m_space.match(text, this->interval.end, end, flags))
    -
    5876 this->interval.end = m_space.interval.end;
    -
    5877 _Assume_(text || this->interval.end >= end);
    -
    5878 if (this->interval.end < end && text[this->interval.end] == '=')
    -
    5879 this->interval.end++;
    -
    5880 else
    -
    5881 while (m_space.match(text, this->interval.end, end, flags))
    -
    5882 this->interval.end = m_space.interval.end;
    -
    5883 if (value.match(text, this->interval.end, end, flags))
    -
    5884 this->interval.end = value.interval.end;
    -
    5885 else
    -
    5886 goto error;
    -
    5887 this->interval.start = start;
    -
    5888 return true;
    -
    5889
    -
    5890 error:
    -
    5891 invalidate();
    -
    5892 return false;
    -
    5893 }
    -
    5894
    -
    5895 http_space m_space;
    -
    5896 };
    +
    5846
    +
    +
    5850 class http_parameter : public parser
    +
    5851 {
    +
    5852 public:
    +
    5853 virtual void invalidate()
    +
    5854 {
    +
    5855 name.invalidate();
    +
    5856 value.invalidate();
    +
    5857 parser::invalidate();
    +
    5858 }
    +
    5859
    + + +
    5862
    +
    5863 protected:
    +
    5864 virtual bool do_match(
    +
    5865 _In_reads_or_z_(end) const char* text,
    +
    5866 _In_ size_t start = 0,
    +
    5867 _In_ size_t end = SIZE_MAX,
    +
    5868 _In_ int flags = match_default)
    +
    5869 {
    +
    5870 _Assume_(text || start >= end);
    +
    5871 this->interval.end = start;
    +
    5872 if (name.match(text, this->interval.end, end, flags))
    +
    5873 this->interval.end = name.interval.end;
    +
    5874 else
    +
    5875 goto error;
    +
    5876 while (m_space.match(text, this->interval.end, end, flags))
    +
    5877 this->interval.end = m_space.interval.end;
    +
    5878 _Assume_(text || this->interval.end >= end);
    +
    5879 if (this->interval.end < end && text[this->interval.end] == '=')
    +
    5880 this->interval.end++;
    +
    5881 else
    +
    5882 while (m_space.match(text, this->interval.end, end, flags))
    +
    5883 this->interval.end = m_space.interval.end;
    +
    5884 if (value.match(text, this->interval.end, end, flags))
    +
    5885 this->interval.end = value.interval.end;
    +
    5886 else
    +
    5887 goto error;
    +
    5888 this->interval.start = start;
    +
    5889 return true;
    +
    5890
    +
    5891 error:
    +
    5892 invalidate();
    +
    5893 return false;
    +
    5894 }
    +
    5895
    +
    5896 http_space m_space;
    +
    5897 };
    -
    5897
    -
    -
    5901 class http_any_type : public parser
    -
    5902 {
    -
    5903 protected:
    -
    5904 virtual bool do_match(
    -
    5905 _In_reads_or_z_(end) const char* text,
    -
    5906 _In_ size_t start = 0,
    -
    5907 _In_ size_t end = SIZE_MAX,
    -
    5908 _In_ int flags = match_default)
    -
    5909 {
    -
    5910 _Assume_(text || start >= end);
    -
    5911 if (start + 2 < end &&
    -
    5912 text[start] == '*' &&
    -
    5913 text[start + 1] == '/' &&
    -
    5914 text[start + 2] == '*')
    -
    5915 {
    -
    5916 this->interval.end = (this->interval.start = start) + 3;
    -
    5917 return true;
    -
    5918 }
    -
    5919 else if (start < end && text[start] == '*') {
    -
    5920 this->interval.end = (this->interval.start = start) + 1;
    -
    5921 return true;
    -
    5922 }
    -
    5923 else {
    -
    5924 this->interval.invalidate();
    -
    5925 return false;
    -
    5926 }
    -
    5927 }
    -
    5928 };
    +
    5898
    +
    +
    5902 class http_any_type : public parser
    +
    5903 {
    +
    5904 protected:
    +
    5905 virtual bool do_match(
    +
    5906 _In_reads_or_z_(end) const char* text,
    +
    5907 _In_ size_t start = 0,
    +
    5908 _In_ size_t end = SIZE_MAX,
    +
    5909 _In_ int flags = match_default)
    +
    5910 {
    +
    5911 _Assume_(text || start >= end);
    +
    5912 if (start + 2 < end &&
    +
    5913 text[start] == '*' &&
    +
    5914 text[start + 1] == '/' &&
    +
    5915 text[start + 2] == '*')
    +
    5916 {
    +
    5917 this->interval.end = (this->interval.start = start) + 3;
    +
    5918 return true;
    +
    5919 }
    +
    5920 else if (start < end && text[start] == '*') {
    +
    5921 this->interval.end = (this->interval.start = start) + 1;
    +
    5922 return true;
    +
    5923 }
    +
    5924 else {
    +
    5925 this->interval.invalidate();
    +
    5926 return false;
    +
    5927 }
    +
    5928 }
    +
    5929 };
    -
    5929
    -
    - -
    5934 {
    -
    5935 public:
    -
    5936 virtual void invalidate()
    -
    5937 {
    -
    5938 type.invalidate();
    -
    5939 subtype.invalidate();
    -
    5940 parser::invalidate();
    -
    5941 }
    -
    5942
    -
    5943 http_token type;
    -
    5944 http_token subtype;
    -
    5945
    -
    5946 protected:
    -
    5947 virtual bool do_match(
    -
    5948 _In_reads_or_z_(end) const char* text,
    -
    5949 _In_ size_t start = 0,
    -
    5950 _In_ size_t end = SIZE_MAX,
    -
    5951 _In_ int flags = match_default)
    -
    5952 {
    -
    5953 _Assume_(text || start >= end);
    -
    5954 this->interval.end = start;
    -
    5955 if (type.match(text, this->interval.end, end, flags))
    -
    5956 this->interval.end = type.interval.end;
    -
    5957 else
    -
    5958 goto error;
    -
    5959 while (m_space.match(text, this->interval.end, end, flags))
    -
    5960 this->interval.end = m_space.interval.end;
    -
    5961 if (this->interval.end < end && text[this->interval.end] == '/')
    -
    5962 this->interval.end++;
    -
    5963 else
    -
    5964 goto error;
    -
    5965 while (m_space.match(text, this->interval.end, end, flags))
    -
    5966 this->interval.end = m_space.interval.end;
    -
    5967 if (subtype.match(text, this->interval.end, end, flags))
    -
    5968 this->interval.end = subtype.interval.end;
    -
    5969 else
    -
    5970 goto error;
    -
    5971 this->interval.start = start;
    -
    5972 return true;
    -
    5973
    -
    5974 error:
    -
    5975 invalidate();
    -
    5976 return false;
    -
    5977 }
    -
    5978
    -
    5979 http_space m_space;
    -
    5980 };
    +
    5930
    +
    + +
    5935 {
    +
    5936 public:
    +
    5937 virtual void invalidate()
    +
    5938 {
    +
    5939 type.invalidate();
    +
    5940 subtype.invalidate();
    +
    5941 parser::invalidate();
    +
    5942 }
    +
    5943
    +
    5944 http_token type;
    +
    5945 http_token subtype;
    +
    5946
    +
    5947 protected:
    +
    5948 virtual bool do_match(
    +
    5949 _In_reads_or_z_(end) const char* text,
    +
    5950 _In_ size_t start = 0,
    +
    5951 _In_ size_t end = SIZE_MAX,
    +
    5952 _In_ int flags = match_default)
    +
    5953 {
    +
    5954 _Assume_(text || start >= end);
    +
    5955 this->interval.end = start;
    +
    5956 if (type.match(text, this->interval.end, end, flags))
    +
    5957 this->interval.end = type.interval.end;
    +
    5958 else
    +
    5959 goto error;
    +
    5960 while (m_space.match(text, this->interval.end, end, flags))
    +
    5961 this->interval.end = m_space.interval.end;
    +
    5962 if (this->interval.end < end && text[this->interval.end] == '/')
    +
    5963 this->interval.end++;
    +
    5964 else
    +
    5965 goto error;
    +
    5966 while (m_space.match(text, this->interval.end, end, flags))
    +
    5967 this->interval.end = m_space.interval.end;
    +
    5968 if (subtype.match(text, this->interval.end, end, flags))
    +
    5969 this->interval.end = subtype.interval.end;
    +
    5970 else
    +
    5971 goto error;
    +
    5972 this->interval.start = start;
    +
    5973 return true;
    +
    5974
    +
    5975 error:
    +
    5976 invalidate();
    +
    5977 return false;
    +
    5978 }
    +
    5979
    +
    5980 http_space m_space;
    +
    5981 };
    -
    5981
    -
    - -
    5986 {
    -
    5987 public:
    -
    5988 virtual void invalidate()
    -
    5989 {
    -
    5990 params.clear();
    -
    5991 http_media_range::invalidate();
    -
    5992 }
    -
    5993
    -
    5994 std::list<http_parameter> params;
    -
    5995
    -
    5996 protected:
    -
    5997 virtual bool do_match(
    -
    5998 _In_reads_or_z_(end) const char* text,
    -
    5999 _In_ size_t start = 0,
    -
    6000 _In_ size_t end = SIZE_MAX,
    -
    6001 _In_ int flags = match_default)
    -
    6002 {
    -
    6003 _Assume_(text || start >= end);
    -
    6004 if (!http_media_range::do_match(text, start, end, flags))
    -
    6005 goto error;
    -
    6006 params.clear();
    -
    6007 for (;;) {
    -
    6008 if (this->interval.end < end && text[this->interval.end]) {
    -
    6009 if (m_space.match(text, this->interval.end, end, flags))
    -
    6010 this->interval.end = m_space.interval.end;
    -
    6011 else if (text[this->interval.end] == ';') {
    -
    6012 this->interval.end++;
    -
    6013 while (m_space.match(text, this->interval.end, end, flags))
    -
    6014 this->interval.end = m_space.interval.end;
    -
    6015 http_parameter param;
    -
    6016 if (param.match(text, this->interval.end, end, flags)) {
    -
    6017 this->interval.end = param.interval.end;
    -
    6018 params.push_back(std::move(param));
    -
    6019 }
    -
    6020 else
    -
    6021 break;
    -
    6022 }
    -
    6023 else
    -
    6024 break;
    -
    6025 }
    -
    6026 else
    -
    6027 break;
    -
    6028 }
    -
    6029 this->interval.end = params.empty() ? subtype.interval.end : params.back().interval.end;
    -
    6030 return true;
    -
    6031
    -
    6032 error:
    -
    6033 invalidate();
    -
    6034 return false;
    -
    6035 }
    -
    6036 };
    +
    5982
    +
    + +
    5987 {
    +
    5988 public:
    +
    5989 virtual void invalidate()
    +
    5990 {
    +
    5991 params.clear();
    +
    5992 http_media_range::invalidate();
    +
    5993 }
    +
    5994
    +
    5995 std::list<http_parameter> params;
    +
    5996
    +
    5997 protected:
    +
    5998 virtual bool do_match(
    +
    5999 _In_reads_or_z_(end) const char* text,
    +
    6000 _In_ size_t start = 0,
    +
    6001 _In_ size_t end = SIZE_MAX,
    +
    6002 _In_ int flags = match_default)
    +
    6003 {
    +
    6004 _Assume_(text || start >= end);
    +
    6005 if (!http_media_range::do_match(text, start, end, flags))
    +
    6006 goto error;
    +
    6007 params.clear();
    +
    6008 for (;;) {
    +
    6009 if (this->interval.end < end && text[this->interval.end]) {
    +
    6010 if (m_space.match(text, this->interval.end, end, flags))
    +
    6011 this->interval.end = m_space.interval.end;
    +
    6012 else if (text[this->interval.end] == ';') {
    +
    6013 this->interval.end++;
    +
    6014 while (m_space.match(text, this->interval.end, end, flags))
    +
    6015 this->interval.end = m_space.interval.end;
    +
    6016 http_parameter param;
    +
    6017 if (param.match(text, this->interval.end, end, flags)) {
    +
    6018 this->interval.end = param.interval.end;
    +
    6019 params.push_back(std::move(param));
    +
    6020 }
    +
    6021 else
    +
    6022 break;
    +
    6023 }
    +
    6024 else
    +
    6025 break;
    +
    6026 }
    +
    6027 else
    +
    6028 break;
    +
    6029 }
    +
    6030 this->interval.end = params.empty() ? subtype.interval.end : params.back().interval.end;
    +
    6031 return true;
    +
    6032
    +
    6033 error:
    +
    6034 invalidate();
    +
    6035 return false;
    +
    6036 }
    +
    6037 };
    -
    6037
    -
    - -
    6042 {
    -
    6043 protected:
    -
    6044 virtual bool do_match(
    -
    6045 _In_reads_or_z_(end) const char* text,
    -
    6046 _In_ size_t start = 0,
    -
    6047 _In_ size_t end = SIZE_MAX,
    -
    6048 _In_ int flags = match_default)
    -
    6049 {
    -
    6050 _Assume_(text || start >= end);
    -
    6051 this->interval.end = start;
    -
    6052 for (;;) {
    -
    6053 if (this->interval.end < end && text[this->interval.end]) {
    -
    6054 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    6055 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    6056 text[this->interval.end] == ':' ||
    -
    6057 text[this->interval.end] == '/' ||
    -
    6058 stdex::isspace(text[this->interval.end]))
    -
    6059 break;
    -
    6060 else
    -
    6061 this->interval.end++;
    -
    6062 }
    -
    6063 else
    -
    6064 break;
    -
    6065 }
    - -
    6067 this->interval.start = start;
    -
    6068 return true;
    -
    6069 }
    -
    6070 this->interval.invalidate();
    -
    6071 return false;
    -
    6072 }
    -
    6073 };
    +
    6038
    +
    + +
    6043 {
    +
    6044 protected:
    +
    6045 virtual bool do_match(
    +
    6046 _In_reads_or_z_(end) const char* text,
    +
    6047 _In_ size_t start = 0,
    +
    6048 _In_ size_t end = SIZE_MAX,
    +
    6049 _In_ int flags = match_default)
    +
    6050 {
    +
    6051 _Assume_(text || start >= end);
    +
    6052 this->interval.end = start;
    +
    6053 for (;;) {
    +
    6054 if (this->interval.end < end && text[this->interval.end]) {
    +
    6055 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    6056 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    6057 text[this->interval.end] == ':' ||
    +
    6058 text[this->interval.end] == '/' ||
    +
    6059 stdex::isspace(text[this->interval.end]))
    +
    6060 break;
    +
    6061 else
    +
    6062 this->interval.end++;
    +
    6063 }
    +
    6064 else
    +
    6065 break;
    +
    6066 }
    + +
    6068 this->interval.start = start;
    +
    6069 return true;
    +
    6070 }
    +
    6071 this->interval.invalidate();
    +
    6072 return false;
    +
    6073 }
    +
    6074 };
    -
    6074
    -
    -
    6078 class http_url_port : public parser
    -
    6079 {
    -
    6080 public:
    -
    6081 http_url_port(_In_ const std::locale& locale = std::locale()) :
    -
    6082 parser(locale),
    -
    6083 value(0)
    -
    6084 {}
    -
    6085
    -
    6086 virtual void invalidate()
    -
    6087 {
    -
    6088 value = 0;
    -
    6089 parser::invalidate();
    -
    6090 }
    -
    6091
    -
    6092 uint16_t value;
    -
    6093
    -
    6094 protected:
    -
    6095 virtual bool do_match(
    -
    6096 _In_reads_or_z_(end) const char* text,
    -
    6097 _In_ size_t start = 0,
    -
    6098 _In_ size_t end = SIZE_MAX,
    -
    6099 _In_ int flags = match_default)
    -
    6100 {
    -
    6101 _Assume_(text || start >= end);
    -
    6102 value = 0;
    -
    6103 this->interval.end = start;
    -
    6104 for (;;) {
    -
    6105 if (this->interval.end < end && text[this->interval.end]) {
    -
    6106 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    -
    6107 size_t _value = (size_t)value * 10 + text[this->interval.end] - '0';
    -
    6108 if (_value > (uint16_t)-1) {
    -
    6109 value = 0;
    -
    6110 this->interval.invalidate();
    -
    6111 return false;
    -
    6112 }
    -
    6113 value = (uint16_t)_value;
    -
    6114 this->interval.end++;
    -
    6115 }
    -
    6116 else
    -
    6117 break;
    -
    6118 }
    -
    6119 else
    -
    6120 break;
    -
    6121 }
    - -
    6123 this->interval.start = start;
    -
    6124 return true;
    -
    6125 }
    -
    6126 this->interval.invalidate();
    -
    6127 return false;
    -
    6128 }
    -
    6129 };
    +
    6075
    +
    +
    6079 class http_url_port : public parser
    +
    6080 {
    +
    6081 public:
    +
    6082 http_url_port(_In_ const std::locale& locale = std::locale()) :
    +
    6083 parser(locale),
    +
    6084 value(0)
    +
    6085 {}
    +
    6086
    +
    6087 virtual void invalidate()
    +
    6088 {
    +
    6089 value = 0;
    +
    6090 parser::invalidate();
    +
    6091 }
    +
    6092
    +
    6093 uint16_t value;
    +
    6094
    +
    6095 protected:
    +
    6096 virtual bool do_match(
    +
    6097 _In_reads_or_z_(end) const char* text,
    +
    6098 _In_ size_t start = 0,
    +
    6099 _In_ size_t end = SIZE_MAX,
    +
    6100 _In_ int flags = match_default)
    +
    6101 {
    +
    6102 _Assume_(text || start >= end);
    +
    6103 value = 0;
    +
    6104 this->interval.end = start;
    +
    6105 for (;;) {
    +
    6106 if (this->interval.end < end && text[this->interval.end]) {
    +
    6107 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    +
    6108 size_t _value = (size_t)value * 10 + text[this->interval.end] - '0';
    +
    6109 if (_value > (uint16_t)-1) {
    +
    6110 value = 0;
    +
    6111 this->interval.invalidate();
    +
    6112 return false;
    +
    6113 }
    +
    6114 value = (uint16_t)_value;
    +
    6115 this->interval.end++;
    +
    6116 }
    +
    6117 else
    +
    6118 break;
    +
    6119 }
    +
    6120 else
    +
    6121 break;
    +
    6122 }
    + +
    6124 this->interval.start = start;
    +
    6125 return true;
    +
    6126 }
    +
    6127 this->interval.invalidate();
    +
    6128 return false;
    +
    6129 }
    +
    6130 };
    -
    6130
    -
    - -
    6135 {
    -
    6136 protected:
    -
    6137 virtual bool do_match(
    -
    6138 _In_reads_or_z_(end) const char* text,
    -
    6139 _In_ size_t start = 0,
    -
    6140 _In_ size_t end = SIZE_MAX,
    -
    6141 _In_ int flags = match_default)
    -
    6142 {
    -
    6143 _Assume_(text || start >= end);
    -
    6144 this->interval.end = start;
    -
    6145 for (;;) {
    -
    6146 if (this->interval.end < end && text[this->interval.end]) {
    -
    6147 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    6148 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    6149 text[this->interval.end] == '?' ||
    -
    6150 text[this->interval.end] == '/' ||
    -
    6151 stdex::isspace(text[this->interval.end]))
    -
    6152 break;
    -
    6153 else
    -
    6154 this->interval.end++;
    -
    6155 }
    -
    6156 else
    -
    6157 break;
    -
    6158 }
    -
    6159 this->interval.start = start;
    -
    6160 return true;
    -
    6161 }
    -
    6162 };
    +
    6131
    +
    + +
    6136 {
    +
    6137 protected:
    +
    6138 virtual bool do_match(
    +
    6139 _In_reads_or_z_(end) const char* text,
    +
    6140 _In_ size_t start = 0,
    +
    6141 _In_ size_t end = SIZE_MAX,
    +
    6142 _In_ int flags = match_default)
    +
    6143 {
    +
    6144 _Assume_(text || start >= end);
    +
    6145 this->interval.end = start;
    +
    6146 for (;;) {
    +
    6147 if (this->interval.end < end && text[this->interval.end]) {
    +
    6148 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    6149 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    6150 text[this->interval.end] == '?' ||
    +
    6151 text[this->interval.end] == '/' ||
    +
    6152 stdex::isspace(text[this->interval.end]))
    +
    6153 break;
    +
    6154 else
    +
    6155 this->interval.end++;
    +
    6156 }
    +
    6157 else
    +
    6158 break;
    +
    6159 }
    +
    6160 this->interval.start = start;
    +
    6161 return true;
    +
    6162 }
    +
    6163 };
    -
    6163
    -
    -
    6167 class http_url_path : public parser
    -
    6168 {
    -
    6169 public:
    -
    6170 virtual void invalidate()
    -
    6171 {
    -
    6172 segments.clear();
    -
    6173 parser::invalidate();
    -
    6174 }
    -
    6175
    -
    6176 std::vector<http_url_path_segment> segments;
    -
    6177
    -
    6178 protected:
    -
    6179 virtual bool do_match(
    -
    6180 _In_reads_or_z_(end) const char* text,
    -
    6181 _In_ size_t start = 0,
    -
    6182 _In_ size_t end = SIZE_MAX,
    -
    6183 _In_ int flags = match_default)
    -
    6184 {
    -
    6185 _Assume_(text || start >= end);
    - -
    6187 this->interval.end = start;
    -
    6188 segments.clear();
    -
    6189 _Assume_(text || this->interval.end >= end);
    -
    6190 if (this->interval.end < end && text[this->interval.end] != '/')
    -
    6191 goto error;
    -
    6192 this->interval.end++;
    -
    6193 s.match(text, this->interval.end, end, flags);
    -
    6194 segments.push_back(s);
    -
    6195 this->interval.end = s.interval.end;
    -
    6196 for (;;) {
    -
    6197 if (this->interval.end < end && text[this->interval.end]) {
    -
    6198 if (text[this->interval.end] == '/') {
    -
    6199 this->interval.end++;
    -
    6200 s.match(text, this->interval.end, end, flags);
    -
    6201 segments.push_back(s);
    -
    6202 this->interval.end = s.interval.end;
    -
    6203 }
    -
    6204 else
    -
    6205 break;
    -
    6206 }
    -
    6207 else
    -
    6208 break;
    -
    6209 }
    -
    6210 this->interval.start = start;
    -
    6211 return true;
    -
    6212
    -
    6213 error:
    -
    6214 invalidate();
    -
    6215 return false;
    -
    6216 }
    -
    6217 };
    +
    6164
    +
    +
    6168 class http_url_path : public parser
    +
    6169 {
    +
    6170 public:
    +
    6171 virtual void invalidate()
    +
    6172 {
    +
    6173 segments.clear();
    +
    6174 parser::invalidate();
    +
    6175 }
    +
    6176
    +
    6177 std::vector<http_url_path_segment> segments;
    +
    6178
    +
    6179 protected:
    +
    6180 virtual bool do_match(
    +
    6181 _In_reads_or_z_(end) const char* text,
    +
    6182 _In_ size_t start = 0,
    +
    6183 _In_ size_t end = SIZE_MAX,
    +
    6184 _In_ int flags = match_default)
    +
    6185 {
    +
    6186 _Assume_(text || start >= end);
    + +
    6188 this->interval.end = start;
    +
    6189 segments.clear();
    +
    6190 _Assume_(text || this->interval.end >= end);
    +
    6191 if (this->interval.end < end && text[this->interval.end] != '/')
    +
    6192 goto error;
    +
    6193 this->interval.end++;
    +
    6194 s.match(text, this->interval.end, end, flags);
    +
    6195 segments.push_back(s);
    +
    6196 this->interval.end = s.interval.end;
    +
    6197 for (;;) {
    +
    6198 if (this->interval.end < end && text[this->interval.end]) {
    +
    6199 if (text[this->interval.end] == '/') {
    +
    6200 this->interval.end++;
    +
    6201 s.match(text, this->interval.end, end, flags);
    +
    6202 segments.push_back(s);
    +
    6203 this->interval.end = s.interval.end;
    +
    6204 }
    +
    6205 else
    +
    6206 break;
    +
    6207 }
    +
    6208 else
    +
    6209 break;
    +
    6210 }
    +
    6211 this->interval.start = start;
    +
    6212 return true;
    +
    6213
    +
    6214 error:
    +
    6215 invalidate();
    +
    6216 return false;
    +
    6217 }
    +
    6218 };
    -
    6218
    -
    - -
    6223 {
    -
    6224 public:
    -
    6225 virtual void invalidate()
    -
    6226 {
    -
    6227 name.start = 1;
    -
    6228 name.end = 0;
    -
    6229 value.start = 1;
    -
    6230 value.end = 0;
    -
    6231 parser::invalidate();
    -
    6232 }
    -
    6233
    - - -
    6236
    -
    6237 protected:
    -
    6238 virtual bool do_match(
    -
    6239 _In_reads_or_z_(end) const char* text,
    -
    6240 _In_ size_t start = 0,
    -
    6241 _In_ size_t end = SIZE_MAX,
    -
    6242 _In_ int flags = match_default)
    -
    6243 {
    -
    6244 _Assume_(text || start >= end);
    -
    6245 this->interval.end = start;
    -
    6246 name.start = this->interval.end;
    -
    6247 for (;;) {
    -
    6248 if (this->interval.end < end && text[this->interval.end]) {
    -
    6249 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    6250 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    6251 text[this->interval.end] == '&' ||
    -
    6252 text[this->interval.end] == '=' ||
    -
    6253 stdex::isspace(text[this->interval.end]))
    -
    6254 break;
    -
    6255 else
    -
    6256 this->interval.end++;
    -
    6257 }
    -
    6258 else
    -
    6259 break;
    -
    6260 }
    - -
    6262 name.end = this->interval.end;
    -
    6263 else
    -
    6264 goto error;
    -
    6265 if (text[this->interval.end] == '=') {
    -
    6266 this->interval.end++;
    -
    6267 value.start = this->interval.end;
    -
    6268 for (;;) {
    -
    6269 if (this->interval.end < end && text[this->interval.end]) {
    -
    6270 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    6271 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    6272 text[this->interval.end] == '&' ||
    -
    6273 stdex::isspace(text[this->interval.end]))
    -
    6274 break;
    -
    6275 else
    -
    6276 this->interval.end++;
    -
    6277 }
    -
    6278 else
    -
    6279 break;
    -
    6280 }
    -
    6281 value.end = this->interval.end;
    -
    6282 }
    -
    6283 else {
    -
    6284 value.start = 1;
    -
    6285 value.end = 0;
    -
    6286 }
    -
    6287 this->interval.start = start;
    -
    6288 return true;
    -
    6289
    -
    6290 error:
    -
    6291 invalidate();
    -
    6292 return false;
    -
    6293 }
    -
    6294 };
    +
    6219
    +
    + +
    6224 {
    +
    6225 public:
    +
    6226 virtual void invalidate()
    +
    6227 {
    +
    6228 name.start = 1;
    +
    6229 name.end = 0;
    +
    6230 value.start = 1;
    +
    6231 value.end = 0;
    +
    6232 parser::invalidate();
    +
    6233 }
    +
    6234
    + + +
    6237
    +
    6238 protected:
    +
    6239 virtual bool do_match(
    +
    6240 _In_reads_or_z_(end) const char* text,
    +
    6241 _In_ size_t start = 0,
    +
    6242 _In_ size_t end = SIZE_MAX,
    +
    6243 _In_ int flags = match_default)
    +
    6244 {
    +
    6245 _Assume_(text || start >= end);
    +
    6246 this->interval.end = start;
    +
    6247 name.start = this->interval.end;
    +
    6248 for (;;) {
    +
    6249 if (this->interval.end < end && text[this->interval.end]) {
    +
    6250 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    6251 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    6252 text[this->interval.end] == '&' ||
    +
    6253 text[this->interval.end] == '=' ||
    +
    6254 stdex::isspace(text[this->interval.end]))
    +
    6255 break;
    +
    6256 else
    +
    6257 this->interval.end++;
    +
    6258 }
    +
    6259 else
    +
    6260 break;
    +
    6261 }
    + +
    6263 name.end = this->interval.end;
    +
    6264 else
    +
    6265 goto error;
    +
    6266 if (text[this->interval.end] == '=') {
    +
    6267 this->interval.end++;
    +
    6268 value.start = this->interval.end;
    +
    6269 for (;;) {
    +
    6270 if (this->interval.end < end && text[this->interval.end]) {
    +
    6271 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    6272 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    6273 text[this->interval.end] == '&' ||
    +
    6274 stdex::isspace(text[this->interval.end]))
    +
    6275 break;
    +
    6276 else
    +
    6277 this->interval.end++;
    +
    6278 }
    +
    6279 else
    +
    6280 break;
    +
    6281 }
    +
    6282 value.end = this->interval.end;
    +
    6283 }
    +
    6284 else {
    +
    6285 value.start = 1;
    +
    6286 value.end = 0;
    +
    6287 }
    +
    6288 this->interval.start = start;
    +
    6289 return true;
    +
    6290
    +
    6291 error:
    +
    6292 invalidate();
    +
    6293 return false;
    +
    6294 }
    +
    6295 };
    -
    6295
    -
    -
    6299 class http_url : public parser
    -
    6300 {
    -
    6301 public:
    -
    6302 http_url(_In_ const std::locale& locale = std::locale()) :
    -
    6303 parser(locale),
    -
    6304 port(locale)
    -
    6305 {}
    -
    6306
    -
    6307 virtual void invalidate()
    -
    6308 {
    -
    6309 server.invalidate();
    -
    6310 port.invalidate();
    -
    6311 path.invalidate();
    -
    6312 params.clear();
    -
    6313 parser::invalidate();
    -
    6314 }
    -
    6315
    -
    6316 http_url_server server;
    -
    6317 http_url_port port;
    -
    6318 http_url_path path;
    -
    6319 std::list<http_url_parameter> params;
    -
    6320
    -
    6321 protected:
    -
    6322 virtual bool do_match(
    -
    6323 _In_reads_or_z_(end) const char* text,
    -
    6324 _In_ size_t start = 0,
    -
    6325 _In_ size_t end = SIZE_MAX,
    -
    6326 _In_ int flags = match_default)
    -
    6327 {
    -
    6328 _Assume_(text || start >= end);
    -
    6329 this->interval.end = start;
    -
    6330
    -
    6331 if (this->interval.end + 7 <= end && stdex::strnicmp(text + this->interval.end, 7, "http://", SIZE_MAX, m_locale) == 0) {
    -
    6332 this->interval.end += 7;
    -
    6333 if (server.match(text, this->interval.end, end, flags))
    -
    6334 this->interval.end = server.interval.end;
    -
    6335 else
    -
    6336 goto error;
    -
    6337 if (this->interval.end < end && text[this->interval.end] == ':') {
    -
    6338 this->interval.end++;
    -
    6339 if (port.match(text, this->interval.end, end, flags))
    -
    6340 this->interval.end = port.interval.end;
    -
    6341 }
    -
    6342 else {
    -
    6343 port.invalidate();
    -
    6344 port.value = 80;
    -
    6345 }
    -
    6346 }
    -
    6347 else {
    -
    6348 server.invalidate();
    -
    6349 port.invalidate();
    -
    6350 port.value = 80;
    -
    6351 }
    -
    6352
    -
    6353 if (path.match(text, this->interval.end, end, flags))
    -
    6354 this->interval.end = path.interval.end;
    -
    6355 else
    -
    6356 goto error;
    -
    6357
    -
    6358 params.clear();
    -
    6359
    -
    6360 if (this->interval.end < end && text[this->interval.end] == '?') {
    -
    6361 this->interval.end++;
    -
    6362 for (;;) {
    -
    6363 if (this->interval.end < end && text[this->interval.end]) {
    -
    6364 if ((unsigned int)text[this->interval.end] < 0x20 ||
    -
    6365 (unsigned int)text[this->interval.end] == 0x7f ||
    -
    6366 stdex::isspace(text[this->interval.end]))
    -
    6367 break;
    -
    6368 else if (text[this->interval.end] == '&')
    -
    6369 this->interval.end++;
    -
    6370 else {
    -
    6371 http_url_parameter param;
    -
    6372 if (param.match(text, this->interval.end, end, flags)) {
    -
    6373 this->interval.end = param.interval.end;
    -
    6374 params.push_back(std::move(param));
    -
    6375 }
    -
    6376 else
    -
    6377 break;
    -
    6378 }
    -
    6379 }
    -
    6380 else
    -
    6381 break;
    -
    6382 }
    -
    6383 }
    -
    6384
    -
    6385 this->interval.start = start;
    -
    6386 return true;
    -
    6387
    -
    6388 error:
    -
    6389 invalidate();
    -
    6390 return false;
    -
    6391 }
    -
    6392 };
    +
    6296
    +
    +
    6300 class http_url : public parser
    +
    6301 {
    +
    6302 public:
    +
    6303 http_url(_In_ const std::locale& locale = std::locale()) :
    +
    6304 parser(locale),
    +
    6305 port(locale)
    +
    6306 {}
    +
    6307
    +
    6308 virtual void invalidate()
    +
    6309 {
    +
    6310 server.invalidate();
    +
    6311 port.invalidate();
    +
    6312 path.invalidate();
    +
    6313 params.clear();
    +
    6314 parser::invalidate();
    +
    6315 }
    +
    6316
    +
    6317 http_url_server server;
    +
    6318 http_url_port port;
    +
    6319 http_url_path path;
    +
    6320 std::list<http_url_parameter> params;
    +
    6321
    +
    6322 protected:
    +
    6323 virtual bool do_match(
    +
    6324 _In_reads_or_z_(end) const char* text,
    +
    6325 _In_ size_t start = 0,
    +
    6326 _In_ size_t end = SIZE_MAX,
    +
    6327 _In_ int flags = match_default)
    +
    6328 {
    +
    6329 _Assume_(text || start >= end);
    +
    6330 this->interval.end = start;
    +
    6331
    +
    6332 if (this->interval.end + 7 <= end && stdex::strnicmp(text + this->interval.end, 7, "http://", SIZE_MAX, m_locale) == 0) {
    +
    6333 this->interval.end += 7;
    +
    6334 if (server.match(text, this->interval.end, end, flags))
    +
    6335 this->interval.end = server.interval.end;
    +
    6336 else
    +
    6337 goto error;
    +
    6338 if (this->interval.end < end && text[this->interval.end] == ':') {
    +
    6339 this->interval.end++;
    +
    6340 if (port.match(text, this->interval.end, end, flags))
    +
    6341 this->interval.end = port.interval.end;
    +
    6342 }
    +
    6343 else {
    +
    6344 port.invalidate();
    +
    6345 port.value = 80;
    +
    6346 }
    +
    6347 }
    +
    6348 else {
    +
    6349 server.invalidate();
    +
    6350 port.invalidate();
    +
    6351 port.value = 80;
    +
    6352 }
    +
    6353
    +
    6354 if (path.match(text, this->interval.end, end, flags))
    +
    6355 this->interval.end = path.interval.end;
    +
    6356 else
    +
    6357 goto error;
    +
    6358
    +
    6359 params.clear();
    +
    6360
    +
    6361 if (this->interval.end < end && text[this->interval.end] == '?') {
    +
    6362 this->interval.end++;
    +
    6363 for (;;) {
    +
    6364 if (this->interval.end < end && text[this->interval.end]) {
    +
    6365 if ((unsigned int)text[this->interval.end] < 0x20 ||
    +
    6366 (unsigned int)text[this->interval.end] == 0x7f ||
    +
    6367 stdex::isspace(text[this->interval.end]))
    +
    6368 break;
    +
    6369 else if (text[this->interval.end] == '&')
    +
    6370 this->interval.end++;
    +
    6371 else {
    +
    6372 http_url_parameter param;
    +
    6373 if (param.match(text, this->interval.end, end, flags)) {
    +
    6374 this->interval.end = param.interval.end;
    +
    6375 params.push_back(std::move(param));
    +
    6376 }
    +
    6377 else
    +
    6378 break;
    +
    6379 }
    +
    6380 }
    +
    6381 else
    +
    6382 break;
    +
    6383 }
    +
    6384 }
    +
    6385
    +
    6386 this->interval.start = start;
    +
    6387 return true;
    +
    6388
    +
    6389 error:
    +
    6390 invalidate();
    +
    6391 return false;
    +
    6392 }
    +
    6393 };
    -
    6393
    -
    -
    6397 class http_language : public parser
    -
    6398 {
    -
    6399 public:
    -
    6400 virtual void invalidate()
    -
    6401 {
    -
    6402 components.clear();
    -
    6403 parser::invalidate();
    -
    6404 }
    -
    6405
    -
    6406 std::vector<stdex::interval<size_t>> components;
    -
    6407
    -
    6408 protected:
    -
    6409 virtual bool do_match(
    -
    6410 _In_reads_or_z_(end) const char* text,
    -
    6411 _In_ size_t start = 0,
    -
    6412 _In_ size_t end = SIZE_MAX,
    -
    6413 _In_ int flags = match_default)
    -
    6414 {
    -
    6415 _Assume_(text || start >= end);
    -
    6416 this->interval.end = start;
    -
    6417 components.clear();
    -
    6418 for (;;) {
    -
    6419 if (this->interval.end < end && text[this->interval.end]) {
    - -
    6421 k.end = this->interval.end;
    -
    6422 for (;;) {
    -
    6423 if (k.end < end && text[k.end]) {
    -
    6424 if (stdex::isalpha(text[k.end]))
    -
    6425 k.end++;
    -
    6426 else
    -
    6427 break;
    -
    6428 }
    -
    6429 else
    -
    6430 break;
    -
    6431 }
    -
    6432 if (this->interval.end < k.end) {
    -
    6433 k.start = this->interval.end;
    -
    6434 this->interval.end = k.end;
    -
    6435 components.push_back(k);
    -
    6436 }
    -
    6437 else
    -
    6438 break;
    -
    6439 if (this->interval.end < end && text[this->interval.end] == '-')
    -
    6440 this->interval.end++;
    -
    6441 else
    -
    6442 break;
    -
    6443 }
    -
    6444 else
    -
    6445 break;
    -
    6446 }
    -
    6447 if (!components.empty()) {
    -
    6448 this->interval.start = start;
    -
    6449 this->interval.end = components.back().end;
    -
    6450 return true;
    -
    6451 }
    -
    6452 this->interval.invalidate();
    -
    6453 return false;
    -
    6454 }
    -
    6455 };
    +
    6394
    +
    +
    6398 class http_language : public parser
    +
    6399 {
    +
    6400 public:
    +
    6401 virtual void invalidate()
    +
    6402 {
    +
    6403 components.clear();
    +
    6404 parser::invalidate();
    +
    6405 }
    +
    6406
    +
    6407 std::vector<stdex::interval<size_t>> components;
    +
    6408
    +
    6409 protected:
    +
    6410 virtual bool do_match(
    +
    6411 _In_reads_or_z_(end) const char* text,
    +
    6412 _In_ size_t start = 0,
    +
    6413 _In_ size_t end = SIZE_MAX,
    +
    6414 _In_ int flags = match_default)
    +
    6415 {
    +
    6416 _Assume_(text || start >= end);
    +
    6417 this->interval.end = start;
    +
    6418 components.clear();
    +
    6419 for (;;) {
    +
    6420 if (this->interval.end < end && text[this->interval.end]) {
    + +
    6422 k.end = this->interval.end;
    +
    6423 for (;;) {
    +
    6424 if (k.end < end && text[k.end]) {
    +
    6425 if (stdex::isalpha(text[k.end]))
    +
    6426 k.end++;
    +
    6427 else
    +
    6428 break;
    +
    6429 }
    +
    6430 else
    +
    6431 break;
    +
    6432 }
    +
    6433 if (this->interval.end < k.end) {
    +
    6434 k.start = this->interval.end;
    +
    6435 this->interval.end = k.end;
    +
    6436 components.push_back(k);
    +
    6437 }
    +
    6438 else
    +
    6439 break;
    +
    6440 if (this->interval.end < end && text[this->interval.end] == '-')
    +
    6441 this->interval.end++;
    +
    6442 else
    +
    6443 break;
    +
    6444 }
    +
    6445 else
    +
    6446 break;
    +
    6447 }
    +
    6448 if (!components.empty()) {
    +
    6449 this->interval.start = start;
    +
    6450 this->interval.end = components.back().end;
    +
    6451 return true;
    +
    6452 }
    +
    6453 this->interval.invalidate();
    +
    6454 return false;
    +
    6455 }
    +
    6456 };
    -
    6456
    -
    -
    6460 class http_weight : public parser
    -
    6461 {
    -
    6462 public:
    -
    6463 http_weight(_In_ const std::locale& locale = std::locale()) :
    -
    6464 parser(locale),
    -
    6465 value(1.0f)
    -
    6466 {}
    -
    6467
    -
    6468 virtual void invalidate()
    -
    6469 {
    -
    6470 value = 1.0f;
    -
    6471 parser::invalidate();
    -
    6472 }
    -
    6473
    -
    6474 float value;
    -
    6475
    -
    6476 protected:
    -
    6477 virtual bool do_match(
    -
    6478 _In_reads_or_z_(end) const char* text,
    -
    6479 _In_ size_t start = 0,
    -
    6480 _In_ size_t end = SIZE_MAX,
    -
    6481 _In_ int flags = match_default)
    -
    6482 {
    -
    6483 _Assume_(text || start >= end);
    -
    6484 size_t celi_del = 0, decimalni_del = 0, decimalni_del_n = 1;
    -
    6485 this->interval.end = start;
    -
    6486 for (;;) {
    -
    6487 if (this->interval.end < end && text[this->interval.end]) {
    -
    6488 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    -
    6489 celi_del = celi_del * 10 + text[this->interval.end] - '0';
    -
    6490 this->interval.end++;
    -
    6491 }
    -
    6492 else if (text[this->interval.end] == '.') {
    -
    6493 this->interval.end++;
    -
    6494 for (;;) {
    -
    6495 if (this->interval.end < end && text[this->interval.end]) {
    -
    6496 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    -
    6497 decimalni_del = decimalni_del * 10 + text[this->interval.end] - '0';
    -
    6498 decimalni_del_n *= 10;
    -
    6499 this->interval.end++;
    -
    6500 }
    -
    6501 else
    -
    6502 break;
    -
    6503 }
    -
    6504 else
    -
    6505 break;
    -
    6506 }
    -
    6507 break;
    -
    6508 }
    -
    6509 else
    -
    6510 break;
    -
    6511 }
    -
    6512 else
    -
    6513 break;
    -
    6514 }
    - - -
    6517 this->interval.start = start;
    -
    6518 return true;
    -
    6519 }
    -
    6520 value = 1.0f;
    -
    6521 this->interval.invalidate();
    -
    6522 return false;
    -
    6523 }
    -
    6524 };
    +
    6457
    +
    +
    6461 class http_weight : public parser
    +
    6462 {
    +
    6463 public:
    +
    6464 http_weight(_In_ const std::locale& locale = std::locale()) :
    +
    6465 parser(locale),
    +
    6466 value(1.0f)
    +
    6467 {}
    +
    6468
    +
    6469 virtual void invalidate()
    +
    6470 {
    +
    6471 value = 1.0f;
    +
    6472 parser::invalidate();
    +
    6473 }
    +
    6474
    +
    6475 float value;
    +
    6476
    +
    6477 protected:
    +
    6478 virtual bool do_match(
    +
    6479 _In_reads_or_z_(end) const char* text,
    +
    6480 _In_ size_t start = 0,
    +
    6481 _In_ size_t end = SIZE_MAX,
    +
    6482 _In_ int flags = match_default)
    +
    6483 {
    +
    6484 _Assume_(text || start >= end);
    +
    6485 size_t celi_del = 0, decimalni_del = 0, decimalni_del_n = 1;
    +
    6486 this->interval.end = start;
    +
    6487 for (;;) {
    +
    6488 if (this->interval.end < end && text[this->interval.end]) {
    +
    6489 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    +
    6490 celi_del = celi_del * 10 + text[this->interval.end] - '0';
    +
    6491 this->interval.end++;
    +
    6492 }
    +
    6493 else if (text[this->interval.end] == '.') {
    +
    6494 this->interval.end++;
    +
    6495 for (;;) {
    +
    6496 if (this->interval.end < end && text[this->interval.end]) {
    +
    6497 if ('0' <= text[this->interval.end] && text[this->interval.end] <= '9') {
    +
    6498 decimalni_del = decimalni_del * 10 + text[this->interval.end] - '0';
    +
    6499 decimalni_del_n *= 10;
    +
    6500 this->interval.end++;
    +
    6501 }
    +
    6502 else
    +
    6503 break;
    +
    6504 }
    +
    6505 else
    +
    6506 break;
    +
    6507 }
    +
    6508 break;
    +
    6509 }
    +
    6510 else
    +
    6511 break;
    +
    6512 }
    +
    6513 else
    +
    6514 break;
    +
    6515 }
    + + +
    6518 this->interval.start = start;
    +
    6519 return true;
    +
    6520 }
    +
    6521 value = 1.0f;
    +
    6522 this->interval.invalidate();
    +
    6523 return false;
    +
    6524 }
    +
    6525 };
    -
    6525
    -
    -
    6529 class http_asterisk : public parser
    -
    6530 {
    -
    6531 protected:
    -
    6532 virtual bool do_match(
    -
    6533 _In_reads_or_z_(end) const char* text,
    -
    6534 _In_ size_t start = 0,
    -
    6535 _In_ size_t end = SIZE_MAX,
    -
    6536 _In_ int flags = match_default)
    -
    6537 {
    -
    6538 _Assume_(text || end <= start);
    -
    6539 if (start < end && text[start] == '*') {
    -
    6540 this->interval.end = (this->interval.start = start) + 1;
    -
    6541 return true;
    -
    6542 }
    -
    6543 this->interval.invalidate();
    -
    6544 return false;
    -
    6545 }
    -
    6546 };
    +
    6526
    +
    +
    6530 class http_asterisk : public parser
    +
    6531 {
    +
    6532 protected:
    +
    6533 virtual bool do_match(
    +
    6534 _In_reads_or_z_(end) const char* text,
    +
    6535 _In_ size_t start = 0,
    +
    6536 _In_ size_t end = SIZE_MAX,
    +
    6537 _In_ int flags = match_default)
    +
    6538 {
    +
    6539 _Assume_(text || end <= start);
    +
    6540 if (start < end && text[start] == '*') {
    +
    6541 this->interval.end = (this->interval.start = start) + 1;
    +
    6542 return true;
    +
    6543 }
    +
    6544 this->interval.invalidate();
    +
    6545 return false;
    +
    6546 }
    +
    6547 };
    -
    6547
    -
    6551 template <class T, class T_asterisk = http_asterisk>
    -
    - -
    6553 {
    -
    6554 public:
    -
    6555 http_weighted_value(_In_ const std::locale& locale = std::locale()) :
    -
    6556 parser(locale),
    -
    6557 factor(locale)
    -
    6558 {}
    -
    6559
    -
    6560 virtual void invalidate()
    -
    6561 {
    -
    6562 asterisk.invalidate();
    -
    6563 value.invalidate();
    -
    6564 factor.invalidate();
    -
    6565 parser::invalidate();
    -
    6566 }
    -
    6567
    -
    6568 T_asterisk asterisk;
    -
    6569 T value;
    -
    6570 http_weight factor;
    -
    6571
    -
    6572 protected:
    -
    6573 virtual bool do_match(
    -
    6574 _In_reads_or_z_(end) const char* text,
    -
    6575 _In_ size_t start = 0,
    -
    6576 _In_ size_t end = SIZE_MAX,
    -
    6577 _In_ int flags = match_default)
    -
    6578 {
    -
    6579 _Assume_(text || start >= end);
    -
    6580 size_t konec_vrednosti;
    -
    6581 this->interval.end = start;
    -
    6582 if (asterisk.match(text, this->interval.end, end, flags)) {
    -
    6583 this->interval.end = konec_vrednosti = asterisk.interval.end;
    -
    6584 value.invalidate();
    -
    6585 }
    -
    6586 else if (value.match(text, this->interval.end, end, flags)) {
    -
    6587 this->interval.end = konec_vrednosti = value.interval.end;
    -
    6588 asterisk.invalidate();
    -
    6589 }
    -
    6590 else {
    -
    6591 asterisk.invalidate();
    -
    6592 value.invalidate();
    -
    6593 this->interval.invalidate();
    -
    6594 return false;
    -
    6595 }
    -
    6596
    -
    6597 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    6598 if (this->interval.end < end && text[this->interval.end] == ';') {
    -
    6599 this->interval.end++;
    -
    6600 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    6601 if (this->interval.end < end && (text[this->interval.end] == 'q' || text[this->interval.end] == 'Q')) {
    -
    6602 this->interval.end++;
    -
    6603 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    6604 if (this->interval.end < end && text[this->interval.end] == '=') {
    -
    6605 this->interval.end++;
    -
    6606 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    -
    6607 if (factor.match(text, this->interval.end, end, flags))
    -
    6608 this->interval.end = factor.interval.end;
    -
    6609 }
    -
    6610 }
    -
    6611 }
    -
    6612 if (!factor.interval) {
    -
    6613 factor.invalidate();
    -
    6614 this->interval.end = konec_vrednosti;
    -
    6615 }
    -
    6616 this->interval.start = start;
    -
    6617 return true;
    -
    6618 }
    -
    6619 };
    +
    6548
    +
    6552 template <class T, class T_asterisk = http_asterisk>
    +
    + +
    6554 {
    +
    6555 public:
    +
    6556 http_weighted_value(_In_ const std::locale& locale = std::locale()) :
    +
    6557 parser(locale),
    +
    6558 factor(locale)
    +
    6559 {}
    +
    6560
    +
    6561 virtual void invalidate()
    +
    6562 {
    +
    6563 asterisk.invalidate();
    +
    6564 value.invalidate();
    +
    6565 factor.invalidate();
    +
    6566 parser::invalidate();
    +
    6567 }
    +
    6568
    +
    6569 T_asterisk asterisk;
    +
    6570 T value;
    +
    6571 http_weight factor;
    +
    6572
    +
    6573 protected:
    +
    6574 virtual bool do_match(
    +
    6575 _In_reads_or_z_(end) const char* text,
    +
    6576 _In_ size_t start = 0,
    +
    6577 _In_ size_t end = SIZE_MAX,
    +
    6578 _In_ int flags = match_default)
    +
    6579 {
    +
    6580 _Assume_(text || start >= end);
    +
    6581 size_t konec_vrednosti;
    +
    6582 this->interval.end = start;
    +
    6583 if (asterisk.match(text, this->interval.end, end, flags)) {
    +
    6584 this->interval.end = konec_vrednosti = asterisk.interval.end;
    +
    6585 value.invalidate();
    +
    6586 }
    +
    6587 else if (value.match(text, this->interval.end, end, flags)) {
    +
    6588 this->interval.end = konec_vrednosti = value.interval.end;
    +
    6589 asterisk.invalidate();
    +
    6590 }
    +
    6591 else {
    +
    6592 asterisk.invalidate();
    +
    6593 value.invalidate();
    +
    6594 this->interval.invalidate();
    +
    6595 return false;
    +
    6596 }
    +
    6597
    +
    6598 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    6599 if (this->interval.end < end && text[this->interval.end] == ';') {
    +
    6600 this->interval.end++;
    +
    6601 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    6602 if (this->interval.end < end && (text[this->interval.end] == 'q' || text[this->interval.end] == 'Q')) {
    +
    6603 this->interval.end++;
    +
    6604 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    6605 if (this->interval.end < end && text[this->interval.end] == '=') {
    +
    6606 this->interval.end++;
    +
    6607 while (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])) this->interval.end++;
    +
    6608 if (factor.match(text, this->interval.end, end, flags))
    +
    6609 this->interval.end = factor.interval.end;
    +
    6610 }
    +
    6611 }
    +
    6612 }
    +
    6613 if (!factor.interval) {
    +
    6614 factor.invalidate();
    +
    6615 this->interval.end = konec_vrednosti;
    +
    6616 }
    +
    6617 this->interval.start = start;
    +
    6618 return true;
    +
    6619 }
    +
    6620 };
    -
    6620
    -
    - -
    6625 {
    -
    6626 public:
    -
    6627 virtual void invalidate()
    -
    6628 {
    -
    6629 name.invalidate();
    -
    6630 value.invalidate();
    -
    6631 parser::invalidate();
    -
    6632 }
    -
    6633
    -
    6634 http_token name;
    -
    6635 http_value value;
    -
    6636
    -
    6637 protected:
    -
    6638 virtual bool do_match(
    -
    6639 _In_reads_or_z_(end) const char* text,
    -
    6640 _In_ size_t start = 0,
    -
    6641 _In_ size_t end = SIZE_MAX,
    -
    6642 _In_ int flags = match_default)
    -
    6643 {
    -
    6644 _Assume_(text || start >= end);
    -
    6645 this->interval.end = start;
    -
    6646 if (this->interval.end < end && text[this->interval.end] == '$')
    -
    6647 this->interval.end++;
    -
    6648 else
    -
    6649 goto error;
    -
    6650 if (name.match(text, this->interval.end, end, flags))
    -
    6651 this->interval.end = name.interval.end;
    -
    6652 else
    -
    6653 goto error;
    -
    6654 while (m_space.match(text, this->interval.end, end, flags))
    -
    6655 this->interval.end = m_space.interval.end;
    -
    6656 if (this->interval.end < end && text[this->interval.end] == '=')
    -
    6657 this->interval.end++;
    -
    6658 else
    -
    6659 goto error;
    -
    6660 while (m_space.match(text, this->interval.end, end, flags))
    -
    6661 this->interval.end = m_space.interval.end;
    -
    6662 if (value.match(text, this->interval.end, end, flags))
    -
    6663 this->interval.end = value.interval.end;
    -
    6664 else
    -
    6665 goto error;
    -
    6666 this->interval.start = start;
    -
    6667 return true;
    -
    6668
    -
    6669 error:
    -
    6670 invalidate();
    -
    6671 return false;
    -
    6672 }
    -
    6673
    -
    6674 http_space m_space;
    -
    6675 };
    +
    6621
    +
    + +
    6626 {
    +
    6627 public:
    +
    6628 virtual void invalidate()
    +
    6629 {
    +
    6630 name.invalidate();
    +
    6631 value.invalidate();
    +
    6632 parser::invalidate();
    +
    6633 }
    +
    6634
    +
    6635 http_token name;
    +
    6636 http_value value;
    +
    6637
    +
    6638 protected:
    +
    6639 virtual bool do_match(
    +
    6640 _In_reads_or_z_(end) const char* text,
    +
    6641 _In_ size_t start = 0,
    +
    6642 _In_ size_t end = SIZE_MAX,
    +
    6643 _In_ int flags = match_default)
    +
    6644 {
    +
    6645 _Assume_(text || start >= end);
    +
    6646 this->interval.end = start;
    +
    6647 if (this->interval.end < end && text[this->interval.end] == '$')
    +
    6648 this->interval.end++;
    +
    6649 else
    +
    6650 goto error;
    +
    6651 if (name.match(text, this->interval.end, end, flags))
    +
    6652 this->interval.end = name.interval.end;
    +
    6653 else
    +
    6654 goto error;
    +
    6655 while (m_space.match(text, this->interval.end, end, flags))
    +
    6656 this->interval.end = m_space.interval.end;
    +
    6657 if (this->interval.end < end && text[this->interval.end] == '=')
    +
    6658 this->interval.end++;
    +
    6659 else
    +
    6660 goto error;
    +
    6661 while (m_space.match(text, this->interval.end, end, flags))
    +
    6662 this->interval.end = m_space.interval.end;
    +
    6663 if (value.match(text, this->interval.end, end, flags))
    +
    6664 this->interval.end = value.interval.end;
    +
    6665 else
    +
    6666 goto error;
    +
    6667 this->interval.start = start;
    +
    6668 return true;
    +
    6669
    +
    6670 error:
    +
    6671 invalidate();
    +
    6672 return false;
    +
    6673 }
    +
    6674
    +
    6675 http_space m_space;
    +
    6676 };
    -
    6676
    -
    -
    6680 class http_cookie : public parser
    -
    6681 {
    -
    6682 public:
    -
    6683 virtual void invalidate()
    -
    6684 {
    -
    6685 name.invalidate();
    -
    6686 value.invalidate();
    -
    6687 params.clear();
    -
    6688 parser::invalidate();
    -
    6689 }
    -
    6690
    - - -
    6693 std::list<http_cookie_parameter> params;
    -
    6694
    -
    6695 protected:
    -
    6696 virtual bool do_match(
    -
    6697 _In_reads_or_z_(end) const char* text,
    -
    6698 _In_ size_t start = 0,
    -
    6699 _In_ size_t end = SIZE_MAX,
    -
    6700 _In_ int flags = match_default)
    -
    6701 {
    -
    6702 _Assume_(text || start >= end);
    -
    6703 this->interval.end = start;
    -
    6704 if (name.match(text, this->interval.end, end, flags))
    -
    6705 this->interval.end = name.interval.end;
    -
    6706 else
    -
    6707 goto error;
    -
    6708 while (m_space.match(text, this->interval.end, end, flags))
    -
    6709 this->interval.end = m_space.interval.end;
    -
    6710 if (this->interval.end < end && text[this->interval.end] == '=')
    -
    6711 this->interval.end++;
    -
    6712 else
    -
    6713 goto error;
    -
    6714 while (m_space.match(text, this->interval.end, end, flags))
    -
    6715 this->interval.end = m_space.interval.end;
    -
    6716 if (value.match(text, this->interval.end, end, flags))
    -
    6717 this->interval.end = value.interval.end;
    -
    6718 else
    -
    6719 goto error;
    -
    6720 params.clear();
    -
    6721 for (;;) {
    -
    6722 if (this->interval.end < end && text[this->interval.end]) {
    -
    6723 if (m_space.match(text, this->interval.end, end, flags))
    -
    6724 this->interval.end = m_space.interval.end;
    -
    6725 else if (text[this->interval.end] == ';') {
    -
    6726 this->interval.end++;
    -
    6727 while (m_space.match(text, this->interval.end, end, flags))
    -
    6728 this->interval.end = m_space.interval.end;
    - -
    6730 if (param.match(text, this->interval.end, end, flags)) {
    -
    6731 this->interval.end = param.interval.end;
    -
    6732 params.push_back(std::move(param));
    -
    6733 }
    -
    6734 else
    -
    6735 break;
    -
    6736 }
    -
    6737 else
    -
    6738 break;
    -
    6739 }
    -
    6740 else
    -
    6741 break;
    -
    6742 }
    -
    6743 this->interval.start = start;
    -
    6744 this->interval.end = params.empty() ? value.interval.end : params.back().interval.end;
    -
    6745 return true;
    -
    6746
    -
    6747 error:
    -
    6748 invalidate();
    -
    6749 return false;
    -
    6750 }
    -
    6751
    -
    6752 http_space m_space;
    -
    6753 };
    +
    6677
    +
    +
    6681 class http_cookie : public parser
    +
    6682 {
    +
    6683 public:
    +
    6684 virtual void invalidate()
    +
    6685 {
    +
    6686 name.invalidate();
    +
    6687 value.invalidate();
    +
    6688 params.clear();
    +
    6689 parser::invalidate();
    +
    6690 }
    +
    6691
    + + +
    6694 std::list<http_cookie_parameter> params;
    +
    6695
    +
    6696 protected:
    +
    6697 virtual bool do_match(
    +
    6698 _In_reads_or_z_(end) const char* text,
    +
    6699 _In_ size_t start = 0,
    +
    6700 _In_ size_t end = SIZE_MAX,
    +
    6701 _In_ int flags = match_default)
    +
    6702 {
    +
    6703 _Assume_(text || start >= end);
    +
    6704 this->interval.end = start;
    +
    6705 if (name.match(text, this->interval.end, end, flags))
    +
    6706 this->interval.end = name.interval.end;
    +
    6707 else
    +
    6708 goto error;
    +
    6709 while (m_space.match(text, this->interval.end, end, flags))
    +
    6710 this->interval.end = m_space.interval.end;
    +
    6711 if (this->interval.end < end && text[this->interval.end] == '=')
    +
    6712 this->interval.end++;
    +
    6713 else
    +
    6714 goto error;
    +
    6715 while (m_space.match(text, this->interval.end, end, flags))
    +
    6716 this->interval.end = m_space.interval.end;
    +
    6717 if (value.match(text, this->interval.end, end, flags))
    +
    6718 this->interval.end = value.interval.end;
    +
    6719 else
    +
    6720 goto error;
    +
    6721 params.clear();
    +
    6722 for (;;) {
    +
    6723 if (this->interval.end < end && text[this->interval.end]) {
    +
    6724 if (m_space.match(text, this->interval.end, end, flags))
    +
    6725 this->interval.end = m_space.interval.end;
    +
    6726 else if (text[this->interval.end] == ';') {
    +
    6727 this->interval.end++;
    +
    6728 while (m_space.match(text, this->interval.end, end, flags))
    +
    6729 this->interval.end = m_space.interval.end;
    + +
    6731 if (param.match(text, this->interval.end, end, flags)) {
    +
    6732 this->interval.end = param.interval.end;
    +
    6733 params.push_back(std::move(param));
    +
    6734 }
    +
    6735 else
    +
    6736 break;
    +
    6737 }
    +
    6738 else
    +
    6739 break;
    +
    6740 }
    +
    6741 else
    +
    6742 break;
    +
    6743 }
    +
    6744 this->interval.start = start;
    +
    6745 this->interval.end = params.empty() ? value.interval.end : params.back().interval.end;
    +
    6746 return true;
    +
    6747
    +
    6748 error:
    +
    6749 invalidate();
    +
    6750 return false;
    +
    6751 }
    +
    6752
    +
    6753 http_space m_space;
    +
    6754 };
    -
    6754
    -
    -
    6758 class http_agent : public parser
    -
    6759 {
    -
    6760 public:
    -
    6761 virtual void invalidate()
    -
    6762 {
    -
    6763 type.start = 1;
    -
    6764 type.end = 0;
    -
    6765 version.start = 1;
    -
    6766 version.end = 0;
    -
    6767 parser::invalidate();
    -
    6768 }
    -
    6769
    - - -
    6772
    -
    6773 protected:
    -
    6774 virtual bool do_match(
    -
    6775 _In_reads_or_z_(end) const char* text,
    -
    6776 _In_ size_t start = 0,
    -
    6777 _In_ size_t end = SIZE_MAX,
    -
    6778 _In_ int flags = match_default)
    -
    6779 {
    -
    6780 _Assume_(text || start >= end);
    -
    6781 this->interval.end = start;
    -
    6782 type.start = this->interval.end;
    -
    6783 for (;;) {
    -
    6784 if (this->interval.end < end && text[this->interval.end]) {
    -
    6785 if (text[this->interval.end] == '/') {
    -
    6786 type.end = this->interval.end;
    -
    6787 this->interval.end++;
    -
    6788 version.start = this->interval.end;
    -
    6789 for (;;) {
    -
    6790 if (this->interval.end < end && text[this->interval.end]) {
    -
    6791 if (stdex::isspace(text[this->interval.end])) {
    -
    6792 version.end = this->interval.end;
    -
    6793 break;
    -
    6794 }
    -
    6795 else
    -
    6796 this->interval.end++;
    -
    6797 }
    -
    6798 else {
    -
    6799 version.end = this->interval.end;
    -
    6800 break;
    -
    6801 }
    -
    6802 }
    -
    6803 break;
    -
    6804 }
    -
    6805 else if (stdex::isspace(text[this->interval.end])) {
    -
    6806 type.end = this->interval.end;
    -
    6807 break;
    -
    6808 }
    -
    6809 else
    -
    6810 this->interval.end++;
    -
    6811 }
    -
    6812 else {
    -
    6813 type.end = this->interval.end;
    -
    6814 break;
    -
    6815 }
    -
    6816 }
    - -
    6818 this->interval.start = start;
    -
    6819 return true;
    -
    6820 }
    -
    6821 type.start = 1;
    -
    6822 type.end = 0;
    -
    6823 version.start = 1;
    -
    6824 version.end = 0;
    -
    6825 this->interval.invalidate();
    -
    6826 return false;
    -
    6827 }
    -
    6828 };
    +
    6755
    +
    +
    6759 class http_agent : public parser
    +
    6760 {
    +
    6761 public:
    +
    6762 virtual void invalidate()
    +
    6763 {
    +
    6764 type.start = 1;
    +
    6765 type.end = 0;
    +
    6766 version.start = 1;
    +
    6767 version.end = 0;
    +
    6768 parser::invalidate();
    +
    6769 }
    +
    6770
    + + +
    6773
    +
    6774 protected:
    +
    6775 virtual bool do_match(
    +
    6776 _In_reads_or_z_(end) const char* text,
    +
    6777 _In_ size_t start = 0,
    +
    6778 _In_ size_t end = SIZE_MAX,
    +
    6779 _In_ int flags = match_default)
    +
    6780 {
    +
    6781 _Assume_(text || start >= end);
    +
    6782 this->interval.end = start;
    +
    6783 type.start = this->interval.end;
    +
    6784 for (;;) {
    +
    6785 if (this->interval.end < end && text[this->interval.end]) {
    +
    6786 if (text[this->interval.end] == '/') {
    +
    6787 type.end = this->interval.end;
    +
    6788 this->interval.end++;
    +
    6789 version.start = this->interval.end;
    +
    6790 for (;;) {
    +
    6791 if (this->interval.end < end && text[this->interval.end]) {
    +
    6792 if (stdex::isspace(text[this->interval.end])) {
    +
    6793 version.end = this->interval.end;
    +
    6794 break;
    +
    6795 }
    +
    6796 else
    +
    6797 this->interval.end++;
    +
    6798 }
    +
    6799 else {
    +
    6800 version.end = this->interval.end;
    +
    6801 break;
    +
    6802 }
    +
    6803 }
    +
    6804 break;
    +
    6805 }
    +
    6806 else if (stdex::isspace(text[this->interval.end])) {
    +
    6807 type.end = this->interval.end;
    +
    6808 break;
    +
    6809 }
    +
    6810 else
    +
    6811 this->interval.end++;
    +
    6812 }
    +
    6813 else {
    +
    6814 type.end = this->interval.end;
    +
    6815 break;
    +
    6816 }
    +
    6817 }
    + +
    6819 this->interval.start = start;
    +
    6820 return true;
    +
    6821 }
    +
    6822 type.start = 1;
    +
    6823 type.end = 0;
    +
    6824 version.start = 1;
    +
    6825 version.end = 0;
    +
    6826 this->interval.invalidate();
    +
    6827 return false;
    +
    6828 }
    +
    6829 };
    -
    6829
    -
    -
    6833 class http_protocol : public parser
    -
    6834 {
    -
    6835 public:
    -
    6836 http_protocol(_In_ const std::locale& locale = std::locale()) :
    -
    6837 parser(locale),
    -
    6838 version(0x009)
    -
    6839 {}
    -
    6840
    -
    6841 virtual void invalidate()
    -
    6842 {
    -
    6843 type.start = 1;
    -
    6844 type.end = 0;
    -
    6845 version_maj.start = 1;
    -
    6846 version_maj.end = 0;
    -
    6847 version_min.start = 1;
    -
    6848 version_min.end = 0;
    -
    6849 version = 0x009;
    -
    6850 parser::invalidate();
    -
    6851 }
    -
    6852
    - -
    6854 stdex::interval<size_t> version_maj;
    -
    6855 stdex::interval<size_t> version_min;
    - -
    6857
    -
    6858 protected:
    -
    6859 virtual bool do_match(
    -
    6860 _In_reads_or_z_(end) const char* text,
    -
    6861 _In_ size_t start = 0,
    -
    6862 _In_ size_t end = SIZE_MAX,
    -
    6863 _In_ int flags = match_default)
    -
    6864 {
    -
    6865 _Assume_(text || start >= end);
    -
    6866 this->interval.end = start;
    -
    6867 type.start = this->interval.end;
    -
    6868 for (;;) {
    -
    6869 if (this->interval.end < end && text[this->interval.end]) {
    -
    6870 if (text[this->interval.end] == '/') {
    -
    6871 type.end = this->interval.end;
    -
    6872 this->interval.end++;
    -
    6873 break;
    -
    6874 }
    -
    6875 else if (stdex::isspace(text[this->interval.end]))
    -
    6876 goto error;
    -
    6877 else
    -
    6878 this->interval.end++;
    -
    6879 }
    -
    6880 else {
    -
    6881 type.end = this->interval.end;
    -
    6882 goto error;
    -
    6883 }
    -
    6884 }
    -
    6885 version_maj.start = this->interval.end;
    -
    6886 for (;;) {
    -
    6887 if (this->interval.end < end && text[this->interval.end]) {
    -
    6888 if (text[this->interval.end] == '.') {
    -
    6889 version_maj.end = this->interval.end;
    -
    6890 this->interval.end++;
    -
    6891 version_min.start = this->interval.end;
    -
    6892 for (;;) {
    -
    6893 if (this->interval.end < end && text[this->interval.end]) {
    -
    6894 if (stdex::isspace(text[this->interval.end])) {
    -
    6895 version_min.end = this->interval.end;
    -
    6896 version =
    -
    6897 (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100 +
    -
    6898 (uint16_t)strtoui(text + version_min.start, version_min.size(), nullptr, 10);
    -
    6899 break;
    -
    6900 }
    -
    6901 else
    -
    6902 this->interval.end++;
    -
    6903 }
    -
    6904 else
    -
    6905 goto error;
    -
    6906 }
    -
    6907 break;
    -
    6908 }
    -
    6909 else if (stdex::isspace(text[this->interval.end])) {
    -
    6910 version_maj.end = this->interval.end;
    -
    6911 version_min.start = 1;
    -
    6912 version_min.end = 0;
    -
    6913 version = (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100;
    -
    6914 break;
    -
    6915 }
    -
    6916 else
    -
    6917 this->interval.end++;
    -
    6918 }
    -
    6919 else
    -
    6920 goto error;
    -
    6921 }
    -
    6922 this->interval.start = start;
    -
    6923 return true;
    -
    6924
    -
    6925 error:
    -
    6926 invalidate();
    -
    6927 return false;
    -
    6928 }
    -
    6929 };
    +
    6830
    +
    +
    6834 class http_protocol : public parser
    +
    6835 {
    +
    6836 public:
    +
    6837 http_protocol(_In_ const std::locale& locale = std::locale()) :
    +
    6838 parser(locale),
    +
    6839 version(0x009)
    +
    6840 {}
    +
    6841
    +
    6842 virtual void invalidate()
    +
    6843 {
    +
    6844 type.start = 1;
    +
    6845 type.end = 0;
    +
    6846 version_maj.start = 1;
    +
    6847 version_maj.end = 0;
    +
    6848 version_min.start = 1;
    +
    6849 version_min.end = 0;
    +
    6850 version = 0x009;
    +
    6851 parser::invalidate();
    +
    6852 }
    +
    6853
    + +
    6855 stdex::interval<size_t> version_maj;
    +
    6856 stdex::interval<size_t> version_min;
    + +
    6858
    +
    6859 protected:
    +
    6860 virtual bool do_match(
    +
    6861 _In_reads_or_z_(end) const char* text,
    +
    6862 _In_ size_t start = 0,
    +
    6863 _In_ size_t end = SIZE_MAX,
    +
    6864 _In_ int flags = match_default)
    +
    6865 {
    +
    6866 _Assume_(text || start >= end);
    +
    6867 this->interval.end = start;
    +
    6868 type.start = this->interval.end;
    +
    6869 for (;;) {
    +
    6870 if (this->interval.end < end && text[this->interval.end]) {
    +
    6871 if (text[this->interval.end] == '/') {
    +
    6872 type.end = this->interval.end;
    +
    6873 this->interval.end++;
    +
    6874 break;
    +
    6875 }
    +
    6876 else if (stdex::isspace(text[this->interval.end]))
    +
    6877 goto error;
    +
    6878 else
    +
    6879 this->interval.end++;
    +
    6880 }
    +
    6881 else {
    +
    6882 type.end = this->interval.end;
    +
    6883 goto error;
    +
    6884 }
    +
    6885 }
    +
    6886 version_maj.start = this->interval.end;
    +
    6887 for (;;) {
    +
    6888 if (this->interval.end < end && text[this->interval.end]) {
    +
    6889 if (text[this->interval.end] == '.') {
    +
    6890 version_maj.end = this->interval.end;
    +
    6891 this->interval.end++;
    +
    6892 version_min.start = this->interval.end;
    +
    6893 for (;;) {
    +
    6894 if (this->interval.end < end && text[this->interval.end]) {
    +
    6895 if (stdex::isspace(text[this->interval.end])) {
    +
    6896 version_min.end = this->interval.end;
    +
    6897 version =
    +
    6898 (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100 +
    +
    6899 (uint16_t)strtoui(text + version_min.start, version_min.size(), nullptr, 10);
    +
    6900 break;
    +
    6901 }
    +
    6902 else
    +
    6903 this->interval.end++;
    +
    6904 }
    +
    6905 else
    +
    6906 goto error;
    +
    6907 }
    +
    6908 break;
    +
    6909 }
    +
    6910 else if (stdex::isspace(text[this->interval.end])) {
    +
    6911 version_maj.end = this->interval.end;
    +
    6912 version_min.start = 1;
    +
    6913 version_min.end = 0;
    +
    6914 version = (uint16_t)strtoui(text + version_maj.start, version_maj.size(), nullptr, 10) * 0x100;
    +
    6915 break;
    +
    6916 }
    +
    6917 else
    +
    6918 this->interval.end++;
    +
    6919 }
    +
    6920 else
    +
    6921 goto error;
    +
    6922 }
    +
    6923 this->interval.start = start;
    +
    6924 return true;
    +
    6925
    +
    6926 error:
    +
    6927 invalidate();
    +
    6928 return false;
    +
    6929 }
    +
    6930 };
    -
    6930
    -
    -
    6934 class http_request : public parser
    -
    6935 {
    -
    6936 public:
    -
    6937 http_request(_In_ const std::locale& locale = std::locale()) :
    -
    6938 parser(locale),
    -
    6939 url(locale),
    -
    6940 protocol(locale)
    -
    6941 {}
    -
    6942
    -
    6943 virtual void invalidate()
    -
    6944 {
    -
    6945 verb.start = 1;
    -
    6946 verb.end = 0;
    -
    6947 url.invalidate();
    -
    6948 protocol.invalidate();
    -
    6949 parser::invalidate();
    -
    6950 }
    -
    6951
    - -
    6953 http_url url;
    -
    6954 http_protocol protocol;
    -
    6955
    -
    6956 protected:
    -
    6957 virtual bool do_match(
    -
    6958 _In_reads_or_z_(end) const char* text,
    -
    6959 _In_ size_t start = 0,
    -
    6960 _In_ size_t end = SIZE_MAX,
    -
    6961 _In_ int flags = match_default)
    -
    6962 {
    -
    6963 _Assume_(text || start >= end);
    -
    6964 this->interval.end = start;
    -
    6965
    -
    6966 for (;;) {
    -
    6967 if (m_line_break.match(text, this->interval.end, end, flags))
    -
    6968 goto error;
    -
    6969 else if (this->interval.end < end && text[this->interval.end]) {
    -
    6970 if (stdex::isspace(text[this->interval.end]))
    -
    6971 this->interval.end++;
    -
    6972 else
    -
    6973 break;
    -
    6974 }
    -
    6975 else
    -
    6976 goto error;
    -
    6977 }
    -
    6978 verb.start = this->interval.end;
    -
    6979 for (;;) {
    -
    6980 if (m_line_break.match(text, this->interval.end, end, flags))
    -
    6981 goto error;
    -
    6982 else if (this->interval.end < end && text[this->interval.end]) {
    -
    6983 if (stdex::isspace(text[this->interval.end])) {
    -
    6984 verb.end = this->interval.end;
    -
    6985 this->interval.end++;
    -
    6986 break;
    -
    6987 }
    -
    6988 else
    -
    6989 this->interval.end++;
    -
    6990 }
    -
    6991 else
    -
    6992 goto error;
    -
    6993 }
    -
    6994
    -
    6995 for (;;) {
    -
    6996 if (m_line_break.match(text, this->interval.end, end, flags))
    -
    6997 goto error;
    -
    6998 else if (this->interval.end < end && text[this->interval.end]) {
    -
    6999 if (stdex::isspace(text[this->interval.end]))
    -
    7000 this->interval.end++;
    -
    7001 else
    -
    7002 break;
    -
    7003 }
    -
    7004 else
    -
    7005 goto error;
    -
    7006 }
    -
    7007 if (url.match(text, this->interval.end, end, flags))
    -
    7008 this->interval.end = url.interval.end;
    -
    7009 else
    -
    7010 goto error;
    -
    7011
    -
    7012 protocol.invalidate();
    -
    7013 for (;;) {
    -
    7014 if (m_line_break.match(text, this->interval.end, end, flags)) {
    -
    7015 this->interval.end = m_line_break.interval.end;
    -
    7016 goto end;
    -
    7017 }
    -
    7018 else if (this->interval.end < end && text[this->interval.end]) {
    -
    7019 if (stdex::isspace(text[this->interval.end]))
    -
    7020 this->interval.end++;
    -
    7021 else
    -
    7022 break;
    -
    7023 }
    -
    7024 else
    -
    7025 goto end;
    -
    7026 }
    -
    7027 for (;;) {
    -
    7028 if (m_line_break.match(text, this->interval.end, end, flags)) {
    -
    7029 this->interval.end = m_line_break.interval.end;
    -
    7030 goto end;
    -
    7031 }
    -
    7032 else if (protocol.match(text, this->interval.end, end, flags)) {
    -
    7033 this->interval.end = protocol.interval.end;
    -
    7034 break;
    -
    7035 }
    -
    7036 else
    -
    7037 goto end;
    -
    7038 }
    -
    7039
    -
    7040 for (;;) {
    -
    7041 if (m_line_break.match(text, this->interval.end, end, flags)) {
    -
    7042 this->interval.end = m_line_break.interval.end;
    -
    7043 break;
    -
    7044 }
    -
    7045 else if (this->interval.end < end && text[this->interval.end])
    -
    7046 this->interval.end++;
    -
    7047 else
    -
    7048 goto end;
    -
    7049 }
    -
    7050
    -
    7051 end:
    -
    7052 this->interval.start = start;
    -
    7053 return true;
    -
    7054
    -
    7055 error:
    -
    7056 invalidate();
    -
    7057 return false;
    -
    7058 }
    -
    7059
    -
    7060 http_line_break m_line_break;
    -
    7061 };
    +
    6931
    +
    +
    6935 class http_request : public parser
    +
    6936 {
    +
    6937 public:
    +
    6938 http_request(_In_ const std::locale& locale = std::locale()) :
    +
    6939 parser(locale),
    +
    6940 url(locale),
    +
    6941 protocol(locale)
    +
    6942 {}
    +
    6943
    +
    6944 virtual void invalidate()
    +
    6945 {
    +
    6946 verb.start = 1;
    +
    6947 verb.end = 0;
    +
    6948 url.invalidate();
    +
    6949 protocol.invalidate();
    +
    6950 parser::invalidate();
    +
    6951 }
    +
    6952
    + +
    6954 http_url url;
    +
    6955 http_protocol protocol;
    +
    6956
    +
    6957 protected:
    +
    6958 virtual bool do_match(
    +
    6959 _In_reads_or_z_(end) const char* text,
    +
    6960 _In_ size_t start = 0,
    +
    6961 _In_ size_t end = SIZE_MAX,
    +
    6962 _In_ int flags = match_default)
    +
    6963 {
    +
    6964 _Assume_(text || start >= end);
    +
    6965 this->interval.end = start;
    +
    6966
    +
    6967 for (;;) {
    +
    6968 if (m_line_break.match(text, this->interval.end, end, flags))
    +
    6969 goto error;
    +
    6970 else if (this->interval.end < end && text[this->interval.end]) {
    +
    6971 if (stdex::isspace(text[this->interval.end]))
    +
    6972 this->interval.end++;
    +
    6973 else
    +
    6974 break;
    +
    6975 }
    +
    6976 else
    +
    6977 goto error;
    +
    6978 }
    +
    6979 verb.start = this->interval.end;
    +
    6980 for (;;) {
    +
    6981 if (m_line_break.match(text, this->interval.end, end, flags))
    +
    6982 goto error;
    +
    6983 else if (this->interval.end < end && text[this->interval.end]) {
    +
    6984 if (stdex::isspace(text[this->interval.end])) {
    +
    6985 verb.end = this->interval.end;
    +
    6986 this->interval.end++;
    +
    6987 break;
    +
    6988 }
    +
    6989 else
    +
    6990 this->interval.end++;
    +
    6991 }
    +
    6992 else
    +
    6993 goto error;
    +
    6994 }
    +
    6995
    +
    6996 for (;;) {
    +
    6997 if (m_line_break.match(text, this->interval.end, end, flags))
    +
    6998 goto error;
    +
    6999 else if (this->interval.end < end && text[this->interval.end]) {
    +
    7000 if (stdex::isspace(text[this->interval.end]))
    +
    7001 this->interval.end++;
    +
    7002 else
    +
    7003 break;
    +
    7004 }
    +
    7005 else
    +
    7006 goto error;
    +
    7007 }
    +
    7008 if (url.match(text, this->interval.end, end, flags))
    +
    7009 this->interval.end = url.interval.end;
    +
    7010 else
    +
    7011 goto error;
    +
    7012
    +
    7013 protocol.invalidate();
    +
    7014 for (;;) {
    +
    7015 if (m_line_break.match(text, this->interval.end, end, flags)) {
    +
    7016 this->interval.end = m_line_break.interval.end;
    +
    7017 goto end;
    +
    7018 }
    +
    7019 else if (this->interval.end < end && text[this->interval.end]) {
    +
    7020 if (stdex::isspace(text[this->interval.end]))
    +
    7021 this->interval.end++;
    +
    7022 else
    +
    7023 break;
    +
    7024 }
    +
    7025 else
    +
    7026 goto end;
    +
    7027 }
    +
    7028 for (;;) {
    +
    7029 if (m_line_break.match(text, this->interval.end, end, flags)) {
    +
    7030 this->interval.end = m_line_break.interval.end;
    +
    7031 goto end;
    +
    7032 }
    +
    7033 else if (protocol.match(text, this->interval.end, end, flags)) {
    +
    7034 this->interval.end = protocol.interval.end;
    +
    7035 break;
    +
    7036 }
    +
    7037 else
    +
    7038 goto end;
    +
    7039 }
    +
    7040
    +
    7041 for (;;) {
    +
    7042 if (m_line_break.match(text, this->interval.end, end, flags)) {
    +
    7043 this->interval.end = m_line_break.interval.end;
    +
    7044 break;
    +
    7045 }
    +
    7046 else if (this->interval.end < end && text[this->interval.end])
    +
    7047 this->interval.end++;
    +
    7048 else
    +
    7049 goto end;
    +
    7050 }
    +
    7051
    +
    7052 end:
    +
    7053 this->interval.start = start;
    +
    7054 return true;
    +
    7055
    +
    7056 error:
    +
    7057 invalidate();
    +
    7058 return false;
    +
    7059 }
    +
    7060
    +
    7061 http_line_break m_line_break;
    +
    7062 };
    -
    7062
    -
    -
    7066 class http_header : public parser
    -
    7067 {
    -
    7068 public:
    -
    7069 virtual void invalidate()
    -
    7070 {
    -
    7071 name.start = 1;
    -
    7072 name.end = 0;
    -
    7073 value.start = 1;
    -
    7074 value.end = 0;
    -
    7075 parser::invalidate();
    -
    7076 }
    -
    7077
    - - -
    7080
    -
    7081 protected:
    -
    7082 virtual bool do_match(
    -
    7083 _In_reads_or_z_(end) const char* text,
    -
    7084 _In_ size_t start = 0,
    -
    7085 _In_ size_t end = SIZE_MAX,
    -
    7086 _In_ int flags = match_default)
    -
    7087 {
    -
    7088 _Assume_(text || start >= end);
    -
    7089 this->interval.end = start;
    -
    7090
    -
    7091 if (m_line_break.match(text, this->interval.end, end, flags) ||
    -
    7092 (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])))
    -
    7093 goto error;
    -
    7094 name.start = this->interval.end;
    -
    7095 for (;;) {
    -
    7096 if (m_line_break.match(text, this->interval.end, end, flags))
    -
    7097 goto error;
    -
    7098 else if (this->interval.end < end && text[this->interval.end]) {
    -
    7099 if (stdex::isspace(text[this->interval.end])) {
    -
    7100 name.end = this->interval.end;
    -
    7101 this->interval.end++;
    -
    7102 for (;;) {
    -
    7103 if (m_line_break.match(text, this->interval.end, end, flags))
    -
    7104 goto error;
    -
    7105 else if (this->interval.end < end && text[this->interval.end]) {
    -
    7106 if (stdex::isspace(text[this->interval.end]))
    -
    7107 this->interval.end++;
    -
    7108 else
    -
    7109 break;
    -
    7110 }
    -
    7111 else
    -
    7112 goto error;
    -
    7113 }
    -
    7114 if (this->interval.end < end && text[this->interval.end] == ':') {
    -
    7115 this->interval.end++;
    -
    7116 break;
    -
    7117 }
    -
    7118 else
    -
    7119 goto error;
    -
    7120 break;
    -
    7121 }
    -
    7122 else if (text[this->interval.end] == ':') {
    -
    7123 name.end = this->interval.end;
    -
    7124 this->interval.end++;
    -
    7125 break;
    -
    7126 }
    -
    7127 else
    -
    7128 this->interval.end++;
    -
    7129 }
    -
    7130 else
    -
    7131 goto error;
    -
    7132 }
    -
    7133 value.start = SIZE_MAX;
    -
    7134 value.end = 0;
    -
    7135 for (;;) {
    -
    7136 if (m_line_break.match(text, this->interval.end, end, flags)) {
    -
    7137 this->interval.end = m_line_break.interval.end;
    -
    7138 if (!m_line_break.match(text, this->interval.end, end, flags) &&
    -
    7139 this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end]))
    -
    7140 this->interval.end++;
    -
    7141 else
    -
    7142 break;
    -
    7143 }
    -
    7144 else if (this->interval.end < end && text[this->interval.end]) {
    -
    7145 if (stdex::isspace(text[this->interval.end]))
    -
    7146 this->interval.end++;
    -
    7147 else {
    -
    7148 if (value.start == SIZE_MAX) value.start = this->interval.end;
    -
    7149 value.end = ++this->interval.end;
    -
    7150 }
    -
    7151 }
    -
    7152 else
    -
    7153 break;
    -
    7154 }
    -
    7155 this->interval.start = start;
    -
    7156 return true;
    -
    7157
    -
    7158 error:
    -
    7159 invalidate();
    -
    7160 return false;
    -
    7161 }
    -
    7162
    -
    7163 http_line_break m_line_break;
    -
    7164 };
    +
    7063
    +
    +
    7067 class http_header : public parser
    +
    7068 {
    +
    7069 public:
    +
    7070 virtual void invalidate()
    +
    7071 {
    +
    7072 name.start = 1;
    +
    7073 name.end = 0;
    +
    7074 value.start = 1;
    +
    7075 value.end = 0;
    +
    7076 parser::invalidate();
    +
    7077 }
    +
    7078
    + + +
    7081
    +
    7082 protected:
    +
    7083 virtual bool do_match(
    +
    7084 _In_reads_or_z_(end) const char* text,
    +
    7085 _In_ size_t start = 0,
    +
    7086 _In_ size_t end = SIZE_MAX,
    +
    7087 _In_ int flags = match_default)
    +
    7088 {
    +
    7089 _Assume_(text || start >= end);
    +
    7090 this->interval.end = start;
    +
    7091
    +
    7092 if (m_line_break.match(text, this->interval.end, end, flags) ||
    +
    7093 (this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end])))
    +
    7094 goto error;
    +
    7095 name.start = this->interval.end;
    +
    7096 for (;;) {
    +
    7097 if (m_line_break.match(text, this->interval.end, end, flags))
    +
    7098 goto error;
    +
    7099 else if (this->interval.end < end && text[this->interval.end]) {
    +
    7100 if (stdex::isspace(text[this->interval.end])) {
    +
    7101 name.end = this->interval.end;
    +
    7102 this->interval.end++;
    +
    7103 for (;;) {
    +
    7104 if (m_line_break.match(text, this->interval.end, end, flags))
    +
    7105 goto error;
    +
    7106 else if (this->interval.end < end && text[this->interval.end]) {
    +
    7107 if (stdex::isspace(text[this->interval.end]))
    +
    7108 this->interval.end++;
    +
    7109 else
    +
    7110 break;
    +
    7111 }
    +
    7112 else
    +
    7113 goto error;
    +
    7114 }
    +
    7115 if (this->interval.end < end && text[this->interval.end] == ':') {
    +
    7116 this->interval.end++;
    +
    7117 break;
    +
    7118 }
    +
    7119 else
    +
    7120 goto error;
    +
    7121 break;
    +
    7122 }
    +
    7123 else if (text[this->interval.end] == ':') {
    +
    7124 name.end = this->interval.end;
    +
    7125 this->interval.end++;
    +
    7126 break;
    +
    7127 }
    +
    7128 else
    +
    7129 this->interval.end++;
    +
    7130 }
    +
    7131 else
    +
    7132 goto error;
    +
    7133 }
    +
    7134 value.start = SIZE_MAX;
    +
    7135 value.end = 0;
    +
    7136 for (;;) {
    +
    7137 if (m_line_break.match(text, this->interval.end, end, flags)) {
    +
    7138 this->interval.end = m_line_break.interval.end;
    +
    7139 if (!m_line_break.match(text, this->interval.end, end, flags) &&
    +
    7140 this->interval.end < end && text[this->interval.end] && stdex::isspace(text[this->interval.end]))
    +
    7141 this->interval.end++;
    +
    7142 else
    +
    7143 break;
    +
    7144 }
    +
    7145 else if (this->interval.end < end && text[this->interval.end]) {
    +
    7146 if (stdex::isspace(text[this->interval.end]))
    +
    7147 this->interval.end++;
    +
    7148 else {
    +
    7149 if (value.start == SIZE_MAX) value.start = this->interval.end;
    +
    7150 value.end = ++this->interval.end;
    +
    7151 }
    +
    7152 }
    +
    7153 else
    +
    7154 break;
    +
    7155 }
    +
    7156 this->interval.start = start;
    +
    7157 return true;
    +
    7158
    +
    7159 error:
    +
    7160 invalidate();
    +
    7161 return false;
    +
    7162 }
    +
    7163
    +
    7164 http_line_break m_line_break;
    +
    7165 };
    -
    7165
    -
    7169 template <class KEY, class T>
    -
    -
    7170 class http_value_collection : public T
    -
    7171 {
    -
    7172 public:
    -
    7173 void insert(
    -
    7174 _In_reads_or_z_(end) const char* text,
    -
    7175 _In_ size_t start = 0,
    -
    7176 _In_ size_t end = SIZE_MAX,
    -
    7177 _In_ int flags = match_default)
    -
    7178 {
    -
    7179 while (start < end) {
    -
    7180 while (start < end && text[start] && stdex::isspace(text[start])) start++;
    -
    7181 if (start < end && text[start] == ',') {
    -
    7182 start++;
    -
    7183 while (start < end&& text[start] && stdex::isspace(text[start])) start++;
    -
    7184 }
    -
    7185 KEY el;
    -
    7186 if (el.match(text, start, end, flags)) {
    -
    7187 start = el.interval.end;
    -
    7188 T::insert(std::move(el));
    -
    7189 }
    -
    7190 else
    -
    7191 break;
    -
    7192 }
    -
    7193 }
    -
    7194 };
    +
    7166
    +
    7170 template <class KEY, class T>
    +
    +
    7171 class http_value_collection : public T
    +
    7172 {
    +
    7173 public:
    +
    7174 void insert(
    +
    7175 _In_reads_or_z_(end) const char* text,
    +
    7176 _In_ size_t start = 0,
    +
    7177 _In_ size_t end = SIZE_MAX,
    +
    7178 _In_ int flags = match_default)
    +
    7179 {
    +
    7180 while (start < end) {
    +
    7181 while (start < end && text[start] && stdex::isspace(text[start])) start++;
    +
    7182 if (start < end && text[start] == ',') {
    +
    7183 start++;
    +
    7184 while (start < end&& text[start] && stdex::isspace(text[start])) start++;
    +
    7185 }
    +
    7186 KEY el;
    +
    7187 if (el.match(text, start, end, flags)) {
    +
    7188 start = el.interval.end;
    +
    7189 T::insert(std::move(el));
    +
    7190 }
    +
    7191 else
    +
    7192 break;
    +
    7193 }
    +
    7194 }
    +
    7195 };
    -
    7195
    -
    7196 template <class T>
    -
    - -
    7198 constexpr bool operator()(const T& a, const T& b) const noexcept
    -
    7199 {
    -
    7200 return a.factor.value > b.factor.value;
    -
    7201 }
    -
    7202 };
    +
    7196
    +
    7197 template <class T>
    +
    + +
    7199 constexpr bool operator()(const T& a, const T& b) const noexcept
    +
    7200 {
    +
    7201 return a.factor.value > b.factor.value;
    +
    7202 }
    +
    7203 };
    -
    7203
    -
    7207 template <class T, class AX = std::allocator<T>>
    - -
    7209
    -
    7213 template <class T>
    -
    - -
    7215 {
    -
    7216 public:
    - -
    7218 _In_ const std::shared_ptr<basic_parser<T>>& quote,
    -
    7219 _In_ const std::shared_ptr<basic_parser<T>>& chr,
    -
    7220 _In_ const std::shared_ptr<basic_parser<T>>& escape,
    -
    7221 _In_ const std::shared_ptr<basic_parser<T>>& sol,
    -
    7222 _In_ const std::shared_ptr<basic_parser<T>>& bs,
    -
    7223 _In_ const std::shared_ptr<basic_parser<T>>& ff,
    -
    7224 _In_ const std::shared_ptr<basic_parser<T>>& lf,
    -
    7225 _In_ const std::shared_ptr<basic_parser<T>>& cr,
    -
    7226 _In_ const std::shared_ptr<basic_parser<T>>& htab,
    -
    7227 _In_ const std::shared_ptr<basic_parser<T>>& uni,
    -
    7228 _In_ const std::shared_ptr<basic_integer16<T>>& hex,
    -
    7229 _In_ const std::locale& locale = std::locale()) :
    - -
    7231 m_quote(quote),
    -
    7232 m_chr(chr),
    -
    7233 m_escape(escape),
    -
    7234 m_sol(sol),
    -
    7235 m_bs(bs),
    -
    7236 m_ff(ff),
    -
    7237 m_lf(lf),
    -
    7238 m_cr(cr),
    -
    7239 m_htab(htab),
    -
    7240 m_uni(uni),
    -
    7241 m_hex(hex)
    -
    7242 {}
    -
    7243
    -
    7244 virtual void invalidate()
    -
    7245 {
    -
    7246 value.clear();
    - -
    7248 }
    -
    7249
    -
    7250 std::basic_string<T> value;
    -
    7251
    -
    7252 protected:
    -
    7253 virtual bool do_match(
    -
    7254 _In_reads_or_z_opt_(end) const T* text,
    -
    7255 _In_ size_t start = 0,
    -
    7256 _In_ size_t end = SIZE_MAX,
    -
    7257 _In_ int flags = match_default)
    -
    7258 {
    -
    7259 _Assume_(text || start >= end);
    -
    7260 this->interval.end = start;
    -
    7261 if (m_quote->match(text, this->interval.end, end, flags)) {
    -
    7262 this->interval.end = m_quote->interval.end;
    -
    7263 value.clear();
    -
    7264 for (;;) {
    -
    7265 if (m_quote->match(text, this->interval.end, end, flags)) {
    -
    7266 this->interval.start = start;
    -
    7267 this->interval.end = m_quote->interval.end;
    -
    7268 return true;
    -
    7269 }
    -
    7270 if (m_escape->match(text, this->interval.end, end, flags)) {
    -
    7271 if (m_quote->match(text, m_escape->interval.end, end, flags)) {
    -
    7272 value += '"'; this->interval.end = m_quote->interval.end;
    -
    7273 continue;
    -
    7274 }
    -
    7275 if (m_sol->match(text, m_escape->interval.end, end, flags)) {
    -
    7276 value += '/'; this->interval.end = m_sol->interval.end;
    -
    7277 continue;
    -
    7278 }
    -
    7279 if (m_bs->match(text, m_escape->interval.end, end, flags)) {
    -
    7280 value += '\b'; this->interval.end = m_bs->interval.end;
    -
    7281 continue;
    -
    7282 }
    -
    7283 if (m_ff->match(text, m_escape->interval.end, end, flags)) {
    -
    7284 value += '\f'; this->interval.end = m_ff->interval.end;
    -
    7285 continue;
    -
    7286 }
    -
    7287 if (m_lf->match(text, m_escape->interval.end, end, flags)) {
    -
    7288 value += '\n'; this->interval.end = m_lf->interval.end;
    -
    7289 continue;
    -
    7290 }
    -
    7291 if (m_cr->match(text, m_escape->interval.end, end, flags)) {
    -
    7292 value += '\r'; this->interval.end = m_cr->interval.end;
    -
    7293 continue;
    -
    7294 }
    -
    7295 if (m_htab->match(text, m_escape->interval.end, end, flags)) {
    -
    7296 value += '\t'; this->interval.end = m_htab->interval.end;
    -
    7297 continue;
    -
    7298 }
    -
    7299 if (
    -
    7300 m_uni->match(text, m_escape->interval.end, end, flags) &&
    -
    7301 m_hex->match(text, m_uni->interval.end, std::min(m_uni->interval.end + 4, end), flags | match_case_insensitive) &&
    -
    7302 m_hex->interval.size() == 4 /* JSON requests 4-digit Unicode sequneces: \u.... */)
    -
    7303 {
    -
    7304 _Assume_(m_hex->value <= 0xffff);
    -
    7305 if (sizeof(T) == 1) {
    -
    7306 if (m_hex->value > 0x7ff) {
    -
    7307 value += (T)(0xe0 | ((m_hex->value >> 12) & 0x0f));
    -
    7308 value += (T)(0x80 | ((m_hex->value >> 6) & 0x3f));
    -
    7309 value += (T)(0x80 | (m_hex->value & 0x3f));
    -
    7310 }
    -
    7311 else if (m_hex->value > 0x7f) {
    -
    7312 value += (T)(0xc0 | ((m_hex->value >> 6) & 0x1f));
    -
    7313 value += (T)(0x80 | (m_hex->value & 0x3f));
    -
    7314 }
    -
    7315 else
    -
    7316 value += (T)(m_hex->value & 0x7f);
    -
    7317 }
    -
    7318 else
    -
    7319 value += (T)m_hex->value;
    -
    7320 this->interval.end = m_hex->interval.end;
    -
    7321 continue;
    -
    7322 }
    -
    7323 if (m_escape->match(text, m_escape->interval.end, end, flags)) {
    -
    7324 value += '\\'; this->interval.end = m_escape->interval.end;
    -
    7325 continue;
    -
    7326 }
    -
    7327 }
    -
    7328 if (m_chr->match(text, this->interval.end, end, flags)) {
    -
    7329 value.append(text + m_chr->interval.start, m_chr->interval.size());
    -
    7330 this->interval.end = m_chr->interval.end;
    -
    7331 continue;
    -
    7332 }
    -
    7333 break;
    -
    7334 }
    -
    7335 }
    -
    7336 value.clear();
    -
    7337 this->interval.invalidate();
    -
    7338 return false;
    -
    7339 }
    -
    7340
    -
    7341 std::shared_ptr<basic_parser<T>> m_quote;
    -
    7342 std::shared_ptr<basic_parser<T>> m_chr;
    -
    7343 std::shared_ptr<basic_parser<T>> m_escape;
    -
    7344 std::shared_ptr<basic_parser<T>> m_sol;
    -
    7345 std::shared_ptr<basic_parser<T>> m_bs;
    -
    7346 std::shared_ptr<basic_parser<T>> m_ff;
    -
    7347 std::shared_ptr<basic_parser<T>> m_lf;
    -
    7348 std::shared_ptr<basic_parser<T>> m_cr;
    -
    7349 std::shared_ptr<basic_parser<T>> m_htab;
    -
    7350 std::shared_ptr<basic_parser<T>> m_uni;
    -
    7351 std::shared_ptr<basic_integer16<T>> m_hex;
    -
    7352 };
    +
    7204
    +
    7208 template <class T, class AX = std::allocator<T>>
    + +
    7210
    +
    7214 template <class T>
    +
    + +
    7216 {
    +
    7217 public:
    + +
    7219 _In_ const std::shared_ptr<basic_parser<T>>& quote,
    +
    7220 _In_ const std::shared_ptr<basic_parser<T>>& chr,
    +
    7221 _In_ const std::shared_ptr<basic_parser<T>>& escape,
    +
    7222 _In_ const std::shared_ptr<basic_parser<T>>& sol,
    +
    7223 _In_ const std::shared_ptr<basic_parser<T>>& bs,
    +
    7224 _In_ const std::shared_ptr<basic_parser<T>>& ff,
    +
    7225 _In_ const std::shared_ptr<basic_parser<T>>& lf,
    +
    7226 _In_ const std::shared_ptr<basic_parser<T>>& cr,
    +
    7227 _In_ const std::shared_ptr<basic_parser<T>>& htab,
    +
    7228 _In_ const std::shared_ptr<basic_parser<T>>& uni,
    +
    7229 _In_ const std::shared_ptr<basic_integer16<T>>& hex,
    +
    7230 _In_ const std::locale& locale = std::locale()) :
    + +
    7232 m_quote(quote),
    +
    7233 m_chr(chr),
    +
    7234 m_escape(escape),
    +
    7235 m_sol(sol),
    +
    7236 m_bs(bs),
    +
    7237 m_ff(ff),
    +
    7238 m_lf(lf),
    +
    7239 m_cr(cr),
    +
    7240 m_htab(htab),
    +
    7241 m_uni(uni),
    +
    7242 m_hex(hex)
    +
    7243 {}
    +
    7244
    +
    7245 virtual void invalidate()
    +
    7246 {
    +
    7247 value.clear();
    + +
    7249 }
    +
    7250
    +
    7251 std::basic_string<T> value;
    +
    7252
    +
    7253 protected:
    +
    7254 virtual bool do_match(
    +
    7255 _In_reads_or_z_opt_(end) const T* text,
    +
    7256 _In_ size_t start = 0,
    +
    7257 _In_ size_t end = SIZE_MAX,
    +
    7258 _In_ int flags = match_default)
    +
    7259 {
    +
    7260 _Assume_(text || start >= end);
    +
    7261 this->interval.end = start;
    +
    7262 if (m_quote->match(text, this->interval.end, end, flags)) {
    +
    7263 this->interval.end = m_quote->interval.end;
    +
    7264 value.clear();
    +
    7265 for (;;) {
    +
    7266 if (m_quote->match(text, this->interval.end, end, flags)) {
    +
    7267 this->interval.start = start;
    +
    7268 this->interval.end = m_quote->interval.end;
    +
    7269 return true;
    +
    7270 }
    +
    7271 if (m_escape->match(text, this->interval.end, end, flags)) {
    +
    7272 if (m_quote->match(text, m_escape->interval.end, end, flags)) {
    +
    7273 value += '"'; this->interval.end = m_quote->interval.end;
    +
    7274 continue;
    +
    7275 }
    +
    7276 if (m_sol->match(text, m_escape->interval.end, end, flags)) {
    +
    7277 value += '/'; this->interval.end = m_sol->interval.end;
    +
    7278 continue;
    +
    7279 }
    +
    7280 if (m_bs->match(text, m_escape->interval.end, end, flags)) {
    +
    7281 value += '\b'; this->interval.end = m_bs->interval.end;
    +
    7282 continue;
    +
    7283 }
    +
    7284 if (m_ff->match(text, m_escape->interval.end, end, flags)) {
    +
    7285 value += '\f'; this->interval.end = m_ff->interval.end;
    +
    7286 continue;
    +
    7287 }
    +
    7288 if (m_lf->match(text, m_escape->interval.end, end, flags)) {
    +
    7289 value += '\n'; this->interval.end = m_lf->interval.end;
    +
    7290 continue;
    +
    7291 }
    +
    7292 if (m_cr->match(text, m_escape->interval.end, end, flags)) {
    +
    7293 value += '\r'; this->interval.end = m_cr->interval.end;
    +
    7294 continue;
    +
    7295 }
    +
    7296 if (m_htab->match(text, m_escape->interval.end, end, flags)) {
    +
    7297 value += '\t'; this->interval.end = m_htab->interval.end;
    +
    7298 continue;
    +
    7299 }
    +
    7300 if (
    +
    7301 m_uni->match(text, m_escape->interval.end, end, flags) &&
    +
    7302 m_hex->match(text, m_uni->interval.end, std::min(m_uni->interval.end + 4, end), flags | match_case_insensitive) &&
    +
    7303 m_hex->interval.size() == 4 /* JSON requests 4-digit Unicode sequneces: \u.... */)
    +
    7304 {
    +
    7305 _Assume_(m_hex->value <= 0xffff);
    +
    7306 if (sizeof(T) == 1) {
    +
    7307 if (m_hex->value > 0x7ff) {
    +
    7308 value += (T)(0xe0 | ((m_hex->value >> 12) & 0x0f));
    +
    7309 value += (T)(0x80 | ((m_hex->value >> 6) & 0x3f));
    +
    7310 value += (T)(0x80 | (m_hex->value & 0x3f));
    +
    7311 }
    +
    7312 else if (m_hex->value > 0x7f) {
    +
    7313 value += (T)(0xc0 | ((m_hex->value >> 6) & 0x1f));
    +
    7314 value += (T)(0x80 | (m_hex->value & 0x3f));
    +
    7315 }
    +
    7316 else
    +
    7317 value += (T)(m_hex->value & 0x7f);
    +
    7318 }
    +
    7319 else
    +
    7320 value += (T)m_hex->value;
    +
    7321 this->interval.end = m_hex->interval.end;
    +
    7322 continue;
    +
    7323 }
    +
    7324 if (m_escape->match(text, m_escape->interval.end, end, flags)) {
    +
    7325 value += '\\'; this->interval.end = m_escape->interval.end;
    +
    7326 continue;
    +
    7327 }
    +
    7328 }
    +
    7329 if (m_chr->match(text, this->interval.end, end, flags)) {
    +
    7330 value.append(text + m_chr->interval.start, m_chr->interval.size());
    +
    7331 this->interval.end = m_chr->interval.end;
    +
    7332 continue;
    +
    7333 }
    +
    7334 break;
    +
    7335 }
    +
    7336 }
    +
    7337 value.clear();
    +
    7338 this->interval.invalidate();
    +
    7339 return false;
    +
    7340 }
    +
    7341
    +
    7342 std::shared_ptr<basic_parser<T>> m_quote;
    +
    7343 std::shared_ptr<basic_parser<T>> m_chr;
    +
    7344 std::shared_ptr<basic_parser<T>> m_escape;
    +
    7345 std::shared_ptr<basic_parser<T>> m_sol;
    +
    7346 std::shared_ptr<basic_parser<T>> m_bs;
    +
    7347 std::shared_ptr<basic_parser<T>> m_ff;
    +
    7348 std::shared_ptr<basic_parser<T>> m_lf;
    +
    7349 std::shared_ptr<basic_parser<T>> m_cr;
    +
    7350 std::shared_ptr<basic_parser<T>> m_htab;
    +
    7351 std::shared_ptr<basic_parser<T>> m_uni;
    +
    7352 std::shared_ptr<basic_integer16<T>> m_hex;
    +
    7353 };
    -
    7353
    - - -
    7356#ifdef _UNICODE
    -
    7357 using tjson_string = wjson_string;
    -
    7358#else
    -
    7359 using tjson_string = json_string;
    -
    7360#endif
    -
    7361
    -
    7365 template <class T>
    -
    - -
    7367 {
    -
    7368 public:
    -
    7369 virtual void invalidate()
    -
    7370 {
    -
    7371 this->content.invalidate();
    -
    7372 basic_parser::invalidate();
    -
    7373 }
    -
    7374
    - -
    7376
    -
    7377 protected:
    -
    7378 virtual bool do_match(
    -
    7379 _In_reads_or_z_opt_(end) const T* text,
    -
    7380 _In_ size_t start = 0,
    -
    7381 _In_ size_t end = SIZE_MAX,
    -
    7382 _In_ int flags = match_multiline)
    -
    7383 {
    -
    7384 _Unreferenced_(flags);
    -
    7385 _Assume_(text || start + 1 >= end);
    -
    7386 if (start + 1 < end &&
    -
    7387 text[start] == '/' &&
    -
    7388 text[start + 1] == '*')
    -
    7389 {
    -
    7390 // /*
    -
    7391 this->content.start = this->interval.end = start + 2;
    -
    7392 for (;;) {
    -
    7393 if (this->interval.end >= end || !text[this->interval.end])
    -
    7394 break;
    -
    7395 if (this->interval.end + 1 < end &&
    -
    7396 text[this->interval.end] == '*' &&
    -
    7397 text[this->interval.end + 1] == '/')
    -
    7398 {
    -
    7399 // /*...*/
    -
    7400 this->content.end = this->interval.end;
    -
    7401 this->interval.start = start;
    -
    7402 this->interval.end = this->interval.end + 2;
    -
    7403 return true;
    -
    7404 }
    -
    7405 this->interval.end++;
    -
    7406 }
    -
    7407 }
    -
    7408 this->content.invalidate();
    -
    7409 this->interval.invalidate();
    -
    7410 return false;
    -
    7411 }
    -
    7412 };
    +
    7354
    + + +
    7357#ifdef _UNICODE
    +
    7358 using tjson_string = wjson_string;
    +
    7359#else
    +
    7360 using tjson_string = json_string;
    +
    7361#endif
    +
    7362
    +
    7366 template <class T>
    +
    + +
    7368 {
    +
    7369 public:
    +
    7370 virtual void invalidate()
    +
    7371 {
    +
    7372 this->content.invalidate();
    +
    7373 basic_parser::invalidate();
    +
    7374 }
    +
    7375
    + +
    7377
    +
    7378 protected:
    +
    7379 virtual bool do_match(
    +
    7380 _In_reads_or_z_opt_(end) const T* text,
    +
    7381 _In_ size_t start = 0,
    +
    7382 _In_ size_t end = SIZE_MAX,
    +
    7383 _In_ int flags = match_multiline)
    +
    7384 {
    +
    7385 _Unreferenced_(flags);
    +
    7386 _Assume_(text || start + 1 >= end);
    +
    7387 if (start + 1 < end &&
    +
    7388 text[start] == '/' &&
    +
    7389 text[start + 1] == '*')
    +
    7390 {
    +
    7391 // /*
    +
    7392 this->content.start = this->interval.end = start + 2;
    +
    7393 for (;;) {
    +
    7394 if (this->interval.end >= end || !text[this->interval.end])
    +
    7395 break;
    +
    7396 if (this->interval.end + 1 < end &&
    +
    7397 text[this->interval.end] == '*' &&
    +
    7398 text[this->interval.end + 1] == '/')
    +
    7399 {
    +
    7400 // /*...*/
    +
    7401 this->content.end = this->interval.end;
    +
    7402 this->interval.start = start;
    +
    7403 this->interval.end = this->interval.end + 2;
    +
    7404 return true;
    +
    7405 }
    +
    7406 this->interval.end++;
    +
    7407 }
    +
    7408 }
    +
    7409 this->content.invalidate();
    +
    7410 this->interval.invalidate();
    +
    7411 return false;
    +
    7412 }
    +
    7413 };
    -
    7413
    -
    7414 using css_comment = basic_css_comment<char>;
    -
    7415 using wcss_comment = basic_css_comment<wchar_t>;
    -
    7416#ifdef _UNICODE
    -
    7417 using tcss_comment = wcss_comment;
    -
    7418#else
    -
    7419 using tcss_comment = css_comment;
    -
    7420#endif
    -
    7421
    -
    7425 template <class T>
    -
    -
    7426 class basic_css_cdo : public basic_parser<T>
    -
    7427 {
    -
    7428 protected:
    -
    7429 virtual bool do_match(
    -
    7430 _In_reads_or_z_opt_(end) const T* text,
    -
    7431 _In_ size_t start = 0,
    -
    7432 _In_ size_t end = SIZE_MAX,
    -
    7433 _In_ int flags = match_multiline)
    -
    7434 {
    -
    7435 _Unreferenced_(flags);
    -
    7436 _Assume_(text || start + 3 >= end);
    -
    7437 if (start + 3 < end &&
    -
    7438 text[start] == '<' &&
    -
    7439 text[start + 1] == '!' &&
    -
    7440 text[start + 2] == '-' &&
    -
    7441 text[start + 3] == '-')
    -
    7442 {
    -
    7443 this->interval.start = start;
    -
    7444 this->interval.end = start + 4;
    -
    7445 return true;
    -
    7446 }
    -
    7447 this->interval.invalidate();
    -
    7448 return false;
    -
    7449 }
    -
    7450 };
    +
    7414
    +
    7415 using css_comment = basic_css_comment<char>;
    +
    7416 using wcss_comment = basic_css_comment<wchar_t>;
    +
    7417#ifdef _UNICODE
    +
    7418 using tcss_comment = wcss_comment;
    +
    7419#else
    +
    7420 using tcss_comment = css_comment;
    +
    7421#endif
    +
    7422
    +
    7426 template <class T>
    +
    +
    7427 class basic_css_cdo : public basic_parser<T>
    +
    7428 {
    +
    7429 protected:
    +
    7430 virtual bool do_match(
    +
    7431 _In_reads_or_z_opt_(end) const T* text,
    +
    7432 _In_ size_t start = 0,
    +
    7433 _In_ size_t end = SIZE_MAX,
    +
    7434 _In_ int flags = match_multiline)
    +
    7435 {
    +
    7436 _Unreferenced_(flags);
    +
    7437 _Assume_(text || start + 3 >= end);
    +
    7438 if (start + 3 < end &&
    +
    7439 text[start] == '<' &&
    +
    7440 text[start + 1] == '!' &&
    +
    7441 text[start + 2] == '-' &&
    +
    7442 text[start + 3] == '-')
    +
    7443 {
    +
    7444 this->interval.start = start;
    +
    7445 this->interval.end = start + 4;
    +
    7446 return true;
    +
    7447 }
    +
    7448 this->interval.invalidate();
    +
    7449 return false;
    +
    7450 }
    +
    7451 };
    -
    7451
    - - -
    7454#ifdef _UNICODE
    -
    7455 using tcss_cdo = wcss_cdo;
    -
    7456#else
    -
    7457 using tcss_cdo = css_cdo;
    -
    7458#endif
    -
    7459
    -
    7463 template <class T>
    -
    -
    7464 class basic_css_cdc : public basic_parser<T>
    -
    7465 {
    -
    7466 protected:
    -
    7467 virtual bool do_match(
    -
    7468 _In_reads_or_z_opt_(end) const T* text,
    -
    7469 _In_ size_t start = 0,
    -
    7470 _In_ size_t end = SIZE_MAX,
    -
    7471 _In_ int flags = match_multiline)
    -
    7472 {
    -
    7473 _Unreferenced_(flags);
    -
    7474 _Assume_(text || start + 2 >= end);
    -
    7475 if (start + 2 < end &&
    -
    7476 text[start] == '-' &&
    -
    7477 text[start + 1] == '-' &&
    -
    7478 text[start + 2] == '>')
    -
    7479 {
    -
    7480 this->interval.start = start;
    -
    7481 this->interval.end = start + 3;
    -
    7482 return true;
    -
    7483 }
    -
    7484 this->interval.invalidate();
    -
    7485 return false;
    -
    7486 }
    -
    7487 };
    +
    7452
    + + +
    7455#ifdef _UNICODE
    +
    7456 using tcss_cdo = wcss_cdo;
    +
    7457#else
    +
    7458 using tcss_cdo = css_cdo;
    +
    7459#endif
    +
    7460
    +
    7464 template <class T>
    +
    +
    7465 class basic_css_cdc : public basic_parser<T>
    +
    7466 {
    +
    7467 protected:
    +
    7468 virtual bool do_match(
    +
    7469 _In_reads_or_z_opt_(end) const T* text,
    +
    7470 _In_ size_t start = 0,
    +
    7471 _In_ size_t end = SIZE_MAX,
    +
    7472 _In_ int flags = match_multiline)
    +
    7473 {
    +
    7474 _Unreferenced_(flags);
    +
    7475 _Assume_(text || start + 2 >= end);
    +
    7476 if (start + 2 < end &&
    +
    7477 text[start] == '-' &&
    +
    7478 text[start + 1] == '-' &&
    +
    7479 text[start + 2] == '>')
    +
    7480 {
    +
    7481 this->interval.start = start;
    +
    7482 this->interval.end = start + 3;
    +
    7483 return true;
    +
    7484 }
    +
    7485 this->interval.invalidate();
    +
    7486 return false;
    +
    7487 }
    +
    7488 };
    -
    7488
    - - -
    7491#ifdef _UNICODE
    -
    7492 using tcss_cdc = wcss_cdc;
    -
    7493#else
    -
    7494 using tcss_cdc = css_cdc;
    -
    7495#endif
    -
    7496
    -
    7500 template <class T>
    -
    - -
    7502 {
    -
    7503 public:
    -
    7504 virtual void invalidate()
    -
    7505 {
    -
    7506 this->content.invalidate();
    -
    7507 basic_parser::invalidate();
    -
    7508 }
    -
    7509
    - -
    7511
    -
    7512 protected:
    -
    7513 virtual bool do_match(
    -
    7514 _In_reads_or_z_opt_(end) const T* text,
    -
    7515 _In_ size_t start = 0,
    -
    7516 _In_ size_t end = SIZE_MAX,
    -
    7517 _In_ int flags = match_multiline)
    -
    7518 {
    -
    7519 _Unreferenced_(flags);
    -
    7520 this->interval.end = start;
    -
    7521 _Assume_(text || this->interval.end >= end);
    -
    7522 if (this->interval.end < end &&
    -
    7523 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    -
    7524 {
    -
    7525 // "Quoted...
    -
    7526 T quote = text[this->interval.end];
    -
    7527 this->content.start = ++this->interval.end;
    -
    7528 for (;;) {
    -
    7529 if (this->interval.end >= end || !text[this->interval.end])
    -
    7530 break;
    -
    7531 if (text[this->interval.end] == quote) {
    -
    7532 // End quote"
    -
    7533 this->content.end = this->interval.end;
    -
    7534 this->interval.start = start;
    -
    7535 this->interval.end++;
    -
    7536 return true;
    -
    7537 }
    -
    7538 if (this->interval.end + 1 < end &&
    -
    7539 text[this->interval.end] == '\\' &&
    -
    7540 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    -
    7541 {
    -
    7542 // Escaped quote
    -
    7543 this->interval.end = this->interval.end + 2;
    -
    7544 }
    -
    7545 else
    -
    7546 this->interval.end++;
    -
    7547 }
    -
    7548 }
    -
    7549
    -
    7550 this->content.invalidate();
    -
    7551 this->interval.invalidate();
    -
    7552 return false;
    -
    7553 }
    -
    7554 };
    +
    7489
    + + +
    7492#ifdef _UNICODE
    +
    7493 using tcss_cdc = wcss_cdc;
    +
    7494#else
    +
    7495 using tcss_cdc = css_cdc;
    +
    7496#endif
    +
    7497
    +
    7501 template <class T>
    +
    + +
    7503 {
    +
    7504 public:
    +
    7505 virtual void invalidate()
    +
    7506 {
    +
    7507 this->content.invalidate();
    +
    7508 basic_parser::invalidate();
    +
    7509 }
    +
    7510
    + +
    7512
    +
    7513 protected:
    +
    7514 virtual bool do_match(
    +
    7515 _In_reads_or_z_opt_(end) const T* text,
    +
    7516 _In_ size_t start = 0,
    +
    7517 _In_ size_t end = SIZE_MAX,
    +
    7518 _In_ int flags = match_multiline)
    +
    7519 {
    +
    7520 _Unreferenced_(flags);
    +
    7521 this->interval.end = start;
    +
    7522 _Assume_(text || this->interval.end >= end);
    +
    7523 if (this->interval.end < end &&
    +
    7524 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    +
    7525 {
    +
    7526 // "Quoted...
    +
    7527 T quote = text[this->interval.end];
    +
    7528 this->content.start = ++this->interval.end;
    +
    7529 for (;;) {
    +
    7530 if (this->interval.end >= end || !text[this->interval.end])
    +
    7531 break;
    +
    7532 if (text[this->interval.end] == quote) {
    +
    7533 // End quote"
    +
    7534 this->content.end = this->interval.end;
    +
    7535 this->interval.start = start;
    +
    7536 this->interval.end++;
    +
    7537 return true;
    +
    7538 }
    +
    7539 if (this->interval.end + 1 < end &&
    +
    7540 text[this->interval.end] == '\\' &&
    +
    7541 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    +
    7542 {
    +
    7543 // Escaped quote
    +
    7544 this->interval.end = this->interval.end + 2;
    +
    7545 }
    +
    7546 else
    +
    7547 this->interval.end++;
    +
    7548 }
    +
    7549 }
    +
    7550
    +
    7551 this->content.invalidate();
    +
    7552 this->interval.invalidate();
    +
    7553 return false;
    +
    7554 }
    +
    7555 };
    -
    7555
    -
    7556 using css_string = basic_css_string<char>;
    -
    7557 using wcss_string = basic_css_string<wchar_t>;
    -
    7558#ifdef _UNICODE
    -
    7559 using tcss_string = wcss_string;
    -
    7560#else
    -
    7561 using tcss_string = css_string;
    -
    7562#endif
    -
    7563
    -
    7567 template <class T>
    -
    -
    7568 class basic_css_uri : public basic_parser<T>
    -
    7569 {
    -
    7570 public:
    -
    7571 virtual void invalidate()
    -
    7572 {
    -
    7573 this->content.invalidate();
    -
    7574 basic_parser::invalidate();
    -
    7575 }
    -
    7576
    - -
    7578
    -
    7579 protected:
    -
    7580 virtual bool do_match(
    -
    7581 _In_reads_or_z_opt_(end) const T* text,
    -
    7582 _In_ size_t start = 0,
    -
    7583 _In_ size_t end = SIZE_MAX,
    -
    7584 _In_ int flags = match_multiline)
    -
    7585 {
    -
    7586 _Unreferenced_(flags);
    -
    7587 this->interval.end = start;
    -
    7588 _Assume_(text || this->interval.end + 3 >= end);
    -
    7589 if (this->interval.end + 3 < end &&
    -
    7590 (text[this->interval.end] == 'u' || text[this->interval.end] == 'U') &&
    -
    7591 (text[this->interval.end + 1] == 'r' || text[this->interval.end + 1] == 'R') &&
    -
    7592 (text[this->interval.end + 2] == 'l' || text[this->interval.end + 2] == 'L') &&
    -
    7593 text[this->interval.end + 3] == '(')
    -
    7594 {
    -
    7595 // url(
    -
    7596 this->interval.end = this->interval.end + 4;
    -
    7597
    -
    7598 // Skip whitespace.
    -
    7599 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    7600 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    7601
    -
    7602 if (this->interval.end < end &&
    -
    7603 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    -
    7604 {
    -
    7605 // url("Quoted...
    -
    7606 T quote = text[this->interval.end];
    -
    7607 this->content.start = ++this->interval.end;
    -
    7608 for (;;) {
    -
    7609 if (this->interval.end >= end || !text[this->interval.end])
    -
    7610 goto error;
    -
    7611 if (text[this->interval.end] == quote) {
    -
    7612 // End quote"
    -
    7613 this->content.end = this->interval.end;
    -
    7614 this->interval.end++;
    -
    7615 break;
    -
    7616 }
    -
    7617 if (this->interval.end + 1 < end &&
    -
    7618 text[this->interval.end] == '\\' &&
    -
    7619 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    -
    7620 {
    -
    7621 // Escaped quote
    -
    7622 this->interval.end = this->interval.end + 2;
    -
    7623 }
    -
    7624 else
    -
    7625 this->interval.end++;
    -
    7626 }
    -
    7627
    -
    7628 // Skip whitespace.
    -
    7629 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    7630
    -
    7631 if (this->interval.end < end &&
    -
    7632 text[this->interval.end] == ')')
    -
    7633 {
    -
    7634 // url("...")
    -
    7635 this->interval.start = start;
    -
    7636 this->interval.end++;
    -
    7637 return true;
    -
    7638 }
    -
    7639 }
    -
    7640 else {
    -
    7641 // url(...
    -
    7642 this->content.start = content.end = this->interval.end;
    -
    7643 for (;;) {
    -
    7644 if (this->interval.end >= end || !text[this->interval.end])
    -
    7645 goto error;
    -
    7646 if (text[this->interval.end] == ')') {
    -
    7647 // url(...)
    -
    7648 this->interval.start = start;
    -
    7649 this->interval.end++;
    -
    7650 return true;
    -
    7651 }
    -
    7652 if (ctype.is(ctype.space, text[this->interval.end]))
    -
    7653 this->interval.end++;
    -
    7654 else
    -
    7655 this->content.end = ++this->interval.end;
    -
    7656 }
    -
    7657 }
    -
    7658 }
    -
    7659
    -
    7660 error:
    -
    7661 invalidate();
    -
    7662 return false;
    -
    7663 }
    -
    7664 };
    +
    7556
    +
    7557 using css_string = basic_css_string<char>;
    +
    7558 using wcss_string = basic_css_string<wchar_t>;
    +
    7559#ifdef _UNICODE
    +
    7560 using tcss_string = wcss_string;
    +
    7561#else
    +
    7562 using tcss_string = css_string;
    +
    7563#endif
    +
    7564
    +
    7568 template <class T>
    +
    +
    7569 class basic_css_uri : public basic_parser<T>
    +
    7570 {
    +
    7571 public:
    +
    7572 virtual void invalidate()
    +
    7573 {
    +
    7574 this->content.invalidate();
    +
    7575 basic_parser::invalidate();
    +
    7576 }
    +
    7577
    + +
    7579
    +
    7580 protected:
    +
    7581 virtual bool do_match(
    +
    7582 _In_reads_or_z_opt_(end) const T* text,
    +
    7583 _In_ size_t start = 0,
    +
    7584 _In_ size_t end = SIZE_MAX,
    +
    7585 _In_ int flags = match_multiline)
    +
    7586 {
    +
    7587 _Unreferenced_(flags);
    +
    7588 this->interval.end = start;
    +
    7589 _Assume_(text || this->interval.end + 3 >= end);
    +
    7590 if (this->interval.end + 3 < end &&
    +
    7591 (text[this->interval.end] == 'u' || text[this->interval.end] == 'U') &&
    +
    7592 (text[this->interval.end + 1] == 'r' || text[this->interval.end + 1] == 'R') &&
    +
    7593 (text[this->interval.end + 2] == 'l' || text[this->interval.end + 2] == 'L') &&
    +
    7594 text[this->interval.end + 3] == '(')
    +
    7595 {
    +
    7596 // url(
    +
    7597 this->interval.end = this->interval.end + 4;
    +
    7598
    +
    7599 // Skip whitespace.
    +
    7600 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    7601 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    7602
    +
    7603 if (this->interval.end < end &&
    +
    7604 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    +
    7605 {
    +
    7606 // url("Quoted...
    +
    7607 T quote = text[this->interval.end];
    +
    7608 this->content.start = ++this->interval.end;
    +
    7609 for (;;) {
    +
    7610 if (this->interval.end >= end || !text[this->interval.end])
    +
    7611 goto error;
    +
    7612 if (text[this->interval.end] == quote) {
    +
    7613 // End quote"
    +
    7614 this->content.end = this->interval.end;
    +
    7615 this->interval.end++;
    +
    7616 break;
    +
    7617 }
    +
    7618 if (this->interval.end + 1 < end &&
    +
    7619 text[this->interval.end] == '\\' &&
    +
    7620 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    +
    7621 {
    +
    7622 // Escaped quote
    +
    7623 this->interval.end = this->interval.end + 2;
    +
    7624 }
    +
    7625 else
    +
    7626 this->interval.end++;
    +
    7627 }
    +
    7628
    +
    7629 // Skip whitespace.
    +
    7630 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    7631
    +
    7632 if (this->interval.end < end &&
    +
    7633 text[this->interval.end] == ')')
    +
    7634 {
    +
    7635 // url("...")
    +
    7636 this->interval.start = start;
    +
    7637 this->interval.end++;
    +
    7638 return true;
    +
    7639 }
    +
    7640 }
    +
    7641 else {
    +
    7642 // url(...
    +
    7643 this->content.start = content.end = this->interval.end;
    +
    7644 for (;;) {
    +
    7645 if (this->interval.end >= end || !text[this->interval.end])
    +
    7646 goto error;
    +
    7647 if (text[this->interval.end] == ')') {
    +
    7648 // url(...)
    +
    7649 this->interval.start = start;
    +
    7650 this->interval.end++;
    +
    7651 return true;
    +
    7652 }
    +
    7653 if (ctype.is(ctype.space, text[this->interval.end]))
    +
    7654 this->interval.end++;
    +
    7655 else
    +
    7656 this->content.end = ++this->interval.end;
    +
    7657 }
    +
    7658 }
    +
    7659 }
    +
    7660
    +
    7661 error:
    +
    7662 invalidate();
    +
    7663 return false;
    +
    7664 }
    +
    7665 };
    -
    7665
    -
    7666 using css_uri = basic_css_uri<char>;
    -
    7667 using wcss_uri = basic_css_uri<wchar_t>;
    -
    7668#ifdef _UNICODE
    -
    7669 using tcss_uri = wcss_uri;
    -
    7670#else
    -
    7671 using tcss_uri = css_uri;
    -
    7672#endif
    -
    7673
    -
    7677 template <class T>
    -
    - -
    7679 {
    -
    7680 public:
    -
    7681 virtual void invalidate()
    -
    7682 {
    -
    7683 this->content.invalidate();
    -
    7684 basic_parser::invalidate();
    -
    7685 }
    -
    7686
    - -
    7688
    -
    7689 protected:
    -
    7690 virtual bool do_match(
    -
    7691 _In_reads_or_z_opt_(end) const T* text,
    -
    7692 _In_ size_t start = 0,
    -
    7693 _In_ size_t end = SIZE_MAX,
    -
    7694 _In_ int flags = match_multiline)
    -
    7695 {
    -
    7696 _Unreferenced_(flags);
    -
    7697 this->interval.end = start;
    -
    7698 _Assume_(text || this->interval.end + 6 >= end);
    -
    7699 if (this->interval.end + 6 < end &&
    -
    7700 text[this->interval.end] == '@' &&
    -
    7701 (text[this->interval.end + 1] == 'i' || text[this->interval.end + 1] == 'I') &&
    -
    7702 (text[this->interval.end + 2] == 'm' || text[this->interval.end + 2] == 'M') &&
    -
    7703 (text[this->interval.end + 3] == 'p' || text[this->interval.end + 3] == 'P') &&
    -
    7704 (text[this->interval.end + 4] == 'o' || text[this->interval.end + 4] == 'O') &&
    -
    7705 (text[this->interval.end + 5] == 'r' || text[this->interval.end + 5] == 'R') &&
    -
    7706 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T'))
    -
    7707 {
    -
    7708 // @import...
    -
    7709 this->interval.end = this->interval.end + 7;
    -
    7710
    -
    7711 // Skip whitespace.
    -
    7712 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    7713 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    7714
    -
    7715 if (this->interval.end < end &&
    -
    7716 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    -
    7717 {
    -
    7718 // @import "Quoted
    -
    7719 T quote = text[this->interval.end];
    -
    7720 this->content.start = ++this->interval.end;
    -
    7721 for (;;) {
    -
    7722 if (this->interval.end >= end || !text[this->interval.end])
    -
    7723 goto error;
    -
    7724 if (text[this->interval.end] == quote) {
    -
    7725 // End quote"
    -
    7726 this->content.end = this->interval.end;
    -
    7727 this->interval.start = start;
    -
    7728 this->interval.end++;
    -
    7729 return true;
    -
    7730 }
    -
    7731 if (this->interval.end + 1 < end &&
    -
    7732 text[this->interval.end] == '\\' &&
    -
    7733 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    -
    7734 {
    -
    7735 // Escaped quote
    -
    7736 this->interval.end = this->interval.end + 2;
    -
    7737 }
    -
    7738 else
    -
    7739 this->interval.end++;
    -
    7740 }
    -
    7741 }
    -
    7742 }
    -
    7743
    -
    7744 error:
    -
    7745 invalidate();
    -
    7746 return false;
    -
    7747 }
    -
    7748 };
    +
    7666
    +
    7667 using css_uri = basic_css_uri<char>;
    +
    7668 using wcss_uri = basic_css_uri<wchar_t>;
    +
    7669#ifdef _UNICODE
    +
    7670 using tcss_uri = wcss_uri;
    +
    7671#else
    +
    7672 using tcss_uri = css_uri;
    +
    7673#endif
    +
    7674
    +
    7678 template <class T>
    +
    + +
    7680 {
    +
    7681 public:
    +
    7682 virtual void invalidate()
    +
    7683 {
    +
    7684 this->content.invalidate();
    +
    7685 basic_parser::invalidate();
    +
    7686 }
    +
    7687
    + +
    7689
    +
    7690 protected:
    +
    7691 virtual bool do_match(
    +
    7692 _In_reads_or_z_opt_(end) const T* text,
    +
    7693 _In_ size_t start = 0,
    +
    7694 _In_ size_t end = SIZE_MAX,
    +
    7695 _In_ int flags = match_multiline)
    +
    7696 {
    +
    7697 _Unreferenced_(flags);
    +
    7698 this->interval.end = start;
    +
    7699 _Assume_(text || this->interval.end + 6 >= end);
    +
    7700 if (this->interval.end + 6 < end &&
    +
    7701 text[this->interval.end] == '@' &&
    +
    7702 (text[this->interval.end + 1] == 'i' || text[this->interval.end + 1] == 'I') &&
    +
    7703 (text[this->interval.end + 2] == 'm' || text[this->interval.end + 2] == 'M') &&
    +
    7704 (text[this->interval.end + 3] == 'p' || text[this->interval.end + 3] == 'P') &&
    +
    7705 (text[this->interval.end + 4] == 'o' || text[this->interval.end + 4] == 'O') &&
    +
    7706 (text[this->interval.end + 5] == 'r' || text[this->interval.end + 5] == 'R') &&
    +
    7707 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T'))
    +
    7708 {
    +
    7709 // @import...
    +
    7710 this->interval.end = this->interval.end + 7;
    +
    7711
    +
    7712 // Skip whitespace.
    +
    7713 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    7714 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    7715
    +
    7716 if (this->interval.end < end &&
    +
    7717 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    +
    7718 {
    +
    7719 // @import "Quoted
    +
    7720 T quote = text[this->interval.end];
    +
    7721 this->content.start = ++this->interval.end;
    +
    7722 for (;;) {
    +
    7723 if (this->interval.end >= end || !text[this->interval.end])
    +
    7724 goto error;
    +
    7725 if (text[this->interval.end] == quote) {
    +
    7726 // End quote"
    +
    7727 this->content.end = this->interval.end;
    +
    7728 this->interval.start = start;
    +
    7729 this->interval.end++;
    +
    7730 return true;
    +
    7731 }
    +
    7732 if (this->interval.end + 1 < end &&
    +
    7733 text[this->interval.end] == '\\' &&
    +
    7734 (text[this->interval.end + 1] == '\"' || text[this->interval.end + 1] == '\''))
    +
    7735 {
    +
    7736 // Escaped quote
    +
    7737 this->interval.end = this->interval.end + 2;
    +
    7738 }
    +
    7739 else
    +
    7740 this->interval.end++;
    +
    7741 }
    +
    7742 }
    +
    7743 }
    +
    7744
    +
    7745 error:
    +
    7746 invalidate();
    +
    7747 return false;
    +
    7748 }
    +
    7749 };
    -
    7749
    -
    7750 using css_import = basic_css_import<char>;
    -
    7751 using wcss_import = basic_css_import<wchar_t>;
    -
    7752#ifdef _UNICODE
    -
    7753 using tcss_import = wcss_import;
    -
    7754#else
    -
    7755 using tcss_import = css_import;
    -
    7756#endif
    -
    7757
    -
    7761 template <class T>
    -
    - -
    7763 {
    -
    7764 public:
    -
    7765 virtual void invalidate()
    -
    7766 {
    -
    7767 this->base_type.invalidate();
    -
    7768 this->sub_type.invalidate();
    -
    7769 this->charset.invalidate();
    -
    7770 basic_parser::invalidate();
    -
    7771 }
    -
    7772
    - - - -
    7776
    -
    7777 protected:
    -
    7778 virtual bool do_match(
    -
    7779 _In_reads_or_z_opt_(end) const T* text,
    -
    7780 _In_ size_t start = 0,
    -
    7781 _In_ size_t end = SIZE_MAX,
    -
    7782 _In_ int flags = match_multiline)
    -
    7783 {
    -
    7784 _Unreferenced_(flags);
    -
    7785 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    7786
    -
    7787 this->interval.end = start;
    -
    7788 this->base_type.start = this->interval.end;
    -
    7789 for (;;) {
    -
    7790 _Assume_(text || this->interval.end >= end);
    -
    7791 if (this->interval.end >= end || !text[this->interval.end])
    -
    7792 break;
    -
    7793 if (text[this->interval.end] == '/' ||
    -
    7794 text[this->interval.end] == ';' ||
    -
    7795 ctype.is(ctype.space, text[this->interval.end]))
    -
    7796 break;
    -
    7797 this->interval.end++;
    -
    7798 }
    -
    7799 if (this->interval.end <= this->base_type.start)
    -
    7800 goto error;
    -
    7801 this->base_type.end = this->interval.end;
    -
    7802
    -
    7803 if (end <= this->interval.end || text[this->interval.end] != '/')
    -
    7804 goto error;
    -
    7805
    -
    7806 this->interval.end++;
    -
    7807 this->sub_type.start = this->interval.end;
    -
    7808 for (;;) {
    -
    7809 if (this->interval.end >= end || !text[this->interval.end])
    -
    7810 break;
    -
    7811 if (text[this->interval.end] == '/' ||
    -
    7812 text[this->interval.end] == ';' ||
    -
    7813 ctype.is(ctype.space, text[this->interval.end]))
    -
    7814 break;
    -
    7815 this->interval.end++;
    -
    7816 }
    -
    7817 if (this->interval.end <= this->sub_type.start)
    -
    7818 goto error;
    -
    7819
    -
    7820 this->sub_type.end = this->interval.end;
    -
    7821 this->charset.invalidate();
    -
    7822 if (this->interval.end < end && text[this->interval.end] == ';') {
    -
    7823 this->interval.end++;
    -
    7824
    -
    7825 // Skip whitespace.
    -
    7826 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    7827
    -
    7828 if (this->interval.end + 7 < end &&
    -
    7829 (text[this->interval.end] == 'c' || text[this->interval.end] == 'C') &&
    -
    7830 (text[this->interval.end + 1] == 'h' || text[this->interval.end + 1] == 'H') &&
    -
    7831 (text[this->interval.end + 2] == 'a' || text[this->interval.end + 2] == 'A') &&
    -
    7832 (text[this->interval.end + 3] == 'r' || text[this->interval.end + 3] == 'R') &&
    -
    7833 (text[this->interval.end + 4] == 's' || text[this->interval.end + 4] == 'S') &&
    -
    7834 (text[this->interval.end + 5] == 'e' || text[this->interval.end + 5] == 'E') &&
    -
    7835 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T') &&
    -
    7836 text[this->interval.end + 7] == '=')
    -
    7837 {
    -
    7838 this->interval.end = this->interval.end + 8;
    -
    7839 if (this->interval.end < end &&
    -
    7840 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    -
    7841 {
    -
    7842 // "Quoted...
    -
    7843 T quote = text[this->interval.end];
    -
    7844 this->charset.start = ++this->interval.end;
    -
    7845 for (;;) {
    -
    7846 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    7847 // No end quote!
    -
    7848 this->charset.invalidate();
    -
    7849 break;
    -
    7850 }
    -
    7851 if (text[this->interval.end] == quote) {
    -
    7852 // End quote"
    -
    7853 this->charset.end = this->interval.end;
    -
    7854 this->interval.end++;
    -
    7855 break;
    -
    7856 }
    -
    7857 this->interval.end++;
    -
    7858 }
    -
    7859 }
    -
    7860 else {
    -
    7861 // Nonquoted
    -
    7862 this->charset.start = this->interval.end;
    -
    7863 for (;;) {
    -
    7864 if (this->interval.end >= end || !text[this->interval.end] ||
    -
    7865 ctype.is(ctype.space, text[this->interval.end])) {
    -
    7866 this->charset.end = this->interval.end;
    -
    7867 break;
    -
    7868 }
    -
    7869 this->interval.end++;
    -
    7870 }
    -
    7871 }
    -
    7872 }
    -
    7873 }
    -
    7874 this->interval.start = start;
    -
    7875 return true;
    -
    7876
    -
    7877 error:
    -
    7878 invalidate();
    -
    7879 return false;
    -
    7880 }
    -
    7881 };
    +
    7750
    +
    7751 using css_import = basic_css_import<char>;
    +
    7752 using wcss_import = basic_css_import<wchar_t>;
    +
    7753#ifdef _UNICODE
    +
    7754 using tcss_import = wcss_import;
    +
    7755#else
    +
    7756 using tcss_import = css_import;
    +
    7757#endif
    +
    7758
    +
    7762 template <class T>
    +
    + +
    7764 {
    +
    7765 public:
    +
    7766 virtual void invalidate()
    +
    7767 {
    +
    7768 this->base_type.invalidate();
    +
    7769 this->sub_type.invalidate();
    +
    7770 this->charset.invalidate();
    +
    7771 basic_parser::invalidate();
    +
    7772 }
    +
    7773
    + + + +
    7777
    +
    7778 protected:
    +
    7779 virtual bool do_match(
    +
    7780 _In_reads_or_z_opt_(end) const T* text,
    +
    7781 _In_ size_t start = 0,
    +
    7782 _In_ size_t end = SIZE_MAX,
    +
    7783 _In_ int flags = match_multiline)
    +
    7784 {
    +
    7785 _Unreferenced_(flags);
    +
    7786 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    7787
    +
    7788 this->interval.end = start;
    +
    7789 this->base_type.start = this->interval.end;
    +
    7790 for (;;) {
    +
    7791 _Assume_(text || this->interval.end >= end);
    +
    7792 if (this->interval.end >= end || !text[this->interval.end])
    +
    7793 break;
    +
    7794 if (text[this->interval.end] == '/' ||
    +
    7795 text[this->interval.end] == ';' ||
    +
    7796 ctype.is(ctype.space, text[this->interval.end]))
    +
    7797 break;
    +
    7798 this->interval.end++;
    +
    7799 }
    +
    7800 if (this->interval.end <= this->base_type.start)
    +
    7801 goto error;
    +
    7802 this->base_type.end = this->interval.end;
    +
    7803
    +
    7804 if (end <= this->interval.end || text[this->interval.end] != '/')
    +
    7805 goto error;
    +
    7806
    +
    7807 this->interval.end++;
    +
    7808 this->sub_type.start = this->interval.end;
    +
    7809 for (;;) {
    +
    7810 if (this->interval.end >= end || !text[this->interval.end])
    +
    7811 break;
    +
    7812 if (text[this->interval.end] == '/' ||
    +
    7813 text[this->interval.end] == ';' ||
    +
    7814 ctype.is(ctype.space, text[this->interval.end]))
    +
    7815 break;
    +
    7816 this->interval.end++;
    +
    7817 }
    +
    7818 if (this->interval.end <= this->sub_type.start)
    +
    7819 goto error;
    +
    7820
    +
    7821 this->sub_type.end = this->interval.end;
    +
    7822 this->charset.invalidate();
    +
    7823 if (this->interval.end < end && text[this->interval.end] == ';') {
    +
    7824 this->interval.end++;
    +
    7825
    +
    7826 // Skip whitespace.
    +
    7827 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    7828
    +
    7829 if (this->interval.end + 7 < end &&
    +
    7830 (text[this->interval.end] == 'c' || text[this->interval.end] == 'C') &&
    +
    7831 (text[this->interval.end + 1] == 'h' || text[this->interval.end + 1] == 'H') &&
    +
    7832 (text[this->interval.end + 2] == 'a' || text[this->interval.end + 2] == 'A') &&
    +
    7833 (text[this->interval.end + 3] == 'r' || text[this->interval.end + 3] == 'R') &&
    +
    7834 (text[this->interval.end + 4] == 's' || text[this->interval.end + 4] == 'S') &&
    +
    7835 (text[this->interval.end + 5] == 'e' || text[this->interval.end + 5] == 'E') &&
    +
    7836 (text[this->interval.end + 6] == 't' || text[this->interval.end + 6] == 'T') &&
    +
    7837 text[this->interval.end + 7] == '=')
    +
    7838 {
    +
    7839 this->interval.end = this->interval.end + 8;
    +
    7840 if (this->interval.end < end &&
    +
    7841 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    +
    7842 {
    +
    7843 // "Quoted...
    +
    7844 T quote = text[this->interval.end];
    +
    7845 this->charset.start = ++this->interval.end;
    +
    7846 for (;;) {
    +
    7847 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    7848 // No end quote!
    +
    7849 this->charset.invalidate();
    +
    7850 break;
    +
    7851 }
    +
    7852 if (text[this->interval.end] == quote) {
    +
    7853 // End quote"
    +
    7854 this->charset.end = this->interval.end;
    +
    7855 this->interval.end++;
    +
    7856 break;
    +
    7857 }
    +
    7858 this->interval.end++;
    +
    7859 }
    +
    7860 }
    +
    7861 else {
    +
    7862 // Nonquoted
    +
    7863 this->charset.start = this->interval.end;
    +
    7864 for (;;) {
    +
    7865 if (this->interval.end >= end || !text[this->interval.end] ||
    +
    7866 ctype.is(ctype.space, text[this->interval.end])) {
    +
    7867 this->charset.end = this->interval.end;
    +
    7868 break;
    +
    7869 }
    +
    7870 this->interval.end++;
    +
    7871 }
    +
    7872 }
    +
    7873 }
    +
    7874 }
    +
    7875 this->interval.start = start;
    +
    7876 return true;
    +
    7877
    +
    7878 error:
    +
    7879 invalidate();
    +
    7880 return false;
    +
    7881 }
    +
    7882 };
    -
    7882
    -
    7883 using mime_type = basic_mime_type<char>;
    -
    7884 using wmime_type = basic_mime_type<wchar_t>;
    -
    7885#ifdef _UNICODE
    -
    7886 using tmime_type = wmime_type;
    -
    7887#else
    -
    7888 using tmime_type = mime_type;
    -
    7889#endif
    -
    7890
    -
    7894 template <class T>
    -
    - -
    7896 {
    -
    7897 protected:
    -
    7898 virtual bool do_match(
    -
    7899 _In_reads_or_z_opt_(end) const T* text,
    -
    7900 _In_ size_t start = 0,
    -
    7901 _In_ size_t end = SIZE_MAX,
    -
    7902 _In_ int flags = match_default)
    -
    7903 {
    -
    7904 _Unreferenced_(flags);
    -
    7905 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    7906 this->interval.end = start;
    -
    7907 for (;;) {
    -
    7908 _Assume_(text || this->interval.end >= end);
    -
    7909 if (this->interval.end >= end || !text[this->interval.end]) {
    - -
    7911 this->interval.start = start;
    -
    7912 return true;
    -
    7913 }
    -
    7914 this->interval.invalidate();
    -
    7915 return false;
    -
    7916 }
    -
    7917 if (text[this->interval.end] == '>' ||
    -
    7918 text[this->interval.end] == '=' ||
    -
    7919 text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>' ||
    -
    7920 ctype.is(ctype.space, text[this->interval.end]))
    -
    7921 {
    -
    7922 this->interval.start = start;
    -
    7923 return true;
    -
    7924 }
    -
    7925 this->interval.end++;
    -
    7926 }
    -
    7927 }
    -
    7928 };
    +
    7883
    +
    7884 using mime_type = basic_mime_type<char>;
    +
    7885 using wmime_type = basic_mime_type<wchar_t>;
    +
    7886#ifdef _UNICODE
    +
    7887 using tmime_type = wmime_type;
    +
    7888#else
    +
    7889 using tmime_type = mime_type;
    +
    7890#endif
    +
    7891
    +
    7895 template <class T>
    +
    + +
    7897 {
    +
    7898 protected:
    +
    7899 virtual bool do_match(
    +
    7900 _In_reads_or_z_opt_(end) const T* text,
    +
    7901 _In_ size_t start = 0,
    +
    7902 _In_ size_t end = SIZE_MAX,
    +
    7903 _In_ int flags = match_default)
    +
    7904 {
    +
    7905 _Unreferenced_(flags);
    +
    7906 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    7907 this->interval.end = start;
    +
    7908 for (;;) {
    +
    7909 _Assume_(text || this->interval.end >= end);
    +
    7910 if (this->interval.end >= end || !text[this->interval.end]) {
    + +
    7912 this->interval.start = start;
    +
    7913 return true;
    +
    7914 }
    +
    7915 this->interval.invalidate();
    +
    7916 return false;
    +
    7917 }
    +
    7918 if (text[this->interval.end] == '>' ||
    +
    7919 text[this->interval.end] == '=' ||
    +
    7920 text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>' ||
    +
    7921 ctype.is(ctype.space, text[this->interval.end]))
    +
    7922 {
    +
    7923 this->interval.start = start;
    +
    7924 return true;
    +
    7925 }
    +
    7926 this->interval.end++;
    +
    7927 }
    +
    7928 }
    +
    7929 };
    -
    7929
    - - -
    7932#ifdef _UNICODE
    -
    7933 using thtml_ident = whtml_ident;
    -
    7934#else
    -
    7935 using thtml_ident = html_ident;
    -
    7936#endif
    -
    7937
    -
    7941 template <class T>
    -
    - -
    7943 {
    -
    7944 public:
    -
    7945 virtual void invalidate()
    -
    7946 {
    -
    7947 this->content.invalidate();
    -
    7948 basic_parser::invalidate();
    -
    7949 }
    -
    7950
    - -
    7952
    -
    7953 protected:
    -
    7954 virtual bool do_match(
    -
    7955 _In_reads_or_z_opt_(end) const T* text,
    -
    7956 _In_ size_t start = 0,
    -
    7957 _In_ size_t end = SIZE_MAX,
    -
    7958 _In_ int flags = match_default)
    -
    7959 {
    -
    7960 _Unreferenced_(flags);
    -
    7961 this->interval.end = start;
    -
    7962 _Assume_(text || this->interval.end >= end);
    -
    7963 if (this->interval.end < end &&
    -
    7964 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    -
    7965 {
    -
    7966 // "Quoted...
    -
    7967 T quote = text[this->interval.end];
    -
    7968 this->content.start = ++this->interval.end;
    -
    7969 for (;;) {
    -
    7970 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    7971 // No end quote!
    -
    7972 this->content.invalidate();
    -
    7973 this->interval.invalidate();
    -
    7974 return false;
    -
    7975 }
    -
    7976 if (text[this->interval.end] == quote) {
    -
    7977 // End quote"
    -
    7978 this->content.end = this->interval.end;
    -
    7979 this->interval.start = start;
    -
    7980 this->interval.end++;
    -
    7981 return true;
    -
    7982 }
    -
    7983 this->interval.end++;
    -
    7984 }
    -
    7985 }
    -
    7986
    -
    7987 // Nonquoted
    -
    7988 this->content.start = this->interval.end;
    -
    7989 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    7990 for (;;) {
    -
    7991 _Assume_(text || this->interval.end >= end);
    -
    7992 if (this->interval.end >= end || !text[this->interval.end]) {
    -
    7993 this->content.end = this->interval.end;
    -
    7994 this->interval.start = start;
    -
    7995 return true;
    -
    7996 }
    -
    7997 if (text[this->interval.end] == '>' ||
    -
    7998 text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>' ||
    -
    7999 ctype.is(ctype.space, text[this->interval.end]))
    -
    8000 {
    -
    8001 this->content.end = this->interval.end;
    -
    8002 this->interval.start = start;
    -
    8003 return true;
    -
    8004 }
    -
    8005 this->interval.end++;
    -
    8006 }
    -
    8007 }
    -
    8008 };
    +
    7930
    + + +
    7933#ifdef _UNICODE
    +
    7934 using thtml_ident = whtml_ident;
    +
    7935#else
    +
    7936 using thtml_ident = html_ident;
    +
    7937#endif
    +
    7938
    +
    7942 template <class T>
    +
    + +
    7944 {
    +
    7945 public:
    +
    7946 virtual void invalidate()
    +
    7947 {
    +
    7948 this->content.invalidate();
    +
    7949 basic_parser::invalidate();
    +
    7950 }
    +
    7951
    + +
    7953
    +
    7954 protected:
    +
    7955 virtual bool do_match(
    +
    7956 _In_reads_or_z_opt_(end) const T* text,
    +
    7957 _In_ size_t start = 0,
    +
    7958 _In_ size_t end = SIZE_MAX,
    +
    7959 _In_ int flags = match_default)
    +
    7960 {
    +
    7961 _Unreferenced_(flags);
    +
    7962 this->interval.end = start;
    +
    7963 _Assume_(text || this->interval.end >= end);
    +
    7964 if (this->interval.end < end &&
    +
    7965 (text[this->interval.end] == '\"' || text[this->interval.end] == '\''))
    +
    7966 {
    +
    7967 // "Quoted...
    +
    7968 T quote = text[this->interval.end];
    +
    7969 this->content.start = ++this->interval.end;
    +
    7970 for (;;) {
    +
    7971 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    7972 // No end quote!
    +
    7973 this->content.invalidate();
    +
    7974 this->interval.invalidate();
    +
    7975 return false;
    +
    7976 }
    +
    7977 if (text[this->interval.end] == quote) {
    +
    7978 // End quote"
    +
    7979 this->content.end = this->interval.end;
    +
    7980 this->interval.start = start;
    +
    7981 this->interval.end++;
    +
    7982 return true;
    +
    7983 }
    +
    7984 this->interval.end++;
    +
    7985 }
    +
    7986 }
    +
    7987
    +
    7988 // Nonquoted
    +
    7989 this->content.start = this->interval.end;
    +
    7990 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    7991 for (;;) {
    +
    7992 _Assume_(text || this->interval.end >= end);
    +
    7993 if (this->interval.end >= end || !text[this->interval.end]) {
    +
    7994 this->content.end = this->interval.end;
    +
    7995 this->interval.start = start;
    +
    7996 return true;
    +
    7997 }
    +
    7998 if (text[this->interval.end] == '>' ||
    +
    7999 text[this->interval.end] == '/' && this->interval.end + 1 < end && text[this->interval.end + 1] == '>' ||
    +
    8000 ctype.is(ctype.space, text[this->interval.end]))
    +
    8001 {
    +
    8002 this->content.end = this->interval.end;
    +
    8003 this->interval.start = start;
    +
    8004 return true;
    +
    8005 }
    +
    8006 this->interval.end++;
    +
    8007 }
    +
    8008 }
    +
    8009 };
    -
    8009
    -
    8010 using html_value = basic_html_value<char>;
    -
    8011 using whtml_value = basic_html_value<wchar_t>;
    -
    8012#ifdef _UNICODE
    -
    8013 using thtml_value = whtml_value;
    -
    8014#else
    -
    8015 using thtml_value = html_value;
    -
    8016#endif
    -
    8017
    -
    8021 enum class html_sequence_t {
    -
    8022 text = 0,
    -
    8023 element,
    -
    8024 element_start,
    -
    8025 element_end,
    -
    8026 declaration,
    -
    8027 comment,
    -
    8028 instruction,
    -
    8029 PCDATA,
    -
    8030 CDATA,
    -
    8031
    -
    8032 unknown = -1,
    -
    8033 };
    -
    8034
    -
    - - - -
    8041 };
    +
    8010
    +
    8011 using html_value = basic_html_value<char>;
    +
    8012 using whtml_value = basic_html_value<wchar_t>;
    +
    8013#ifdef _UNICODE
    +
    8014 using thtml_value = whtml_value;
    +
    8015#else
    +
    8016 using thtml_value = html_value;
    +
    8017#endif
    +
    8018
    +
    8022 enum class html_sequence_t {
    +
    8023 text = 0,
    +
    8024 element,
    +
    8025 element_start,
    +
    8026 element_end,
    +
    8027 declaration,
    +
    8028 comment,
    +
    8029 instruction,
    +
    8030 PCDATA,
    +
    8031 CDATA,
    +
    8032
    +
    8033 unknown = -1,
    +
    8034 };
    +
    8035
    + -
    8042
    -
    8046 template <class T>
    -
    - -
    8048 {
    -
    8049 public:
    -
    8050 basic_html_tag(_In_ const std::locale& locale = std::locale()) :
    - -
    8052 type(html_sequence_t::unknown)
    -
    8053 {}
    -
    8054
    -
    8055 virtual void invalidate()
    -
    8056 {
    -
    8057 this->type = html_sequence_t::unknown;
    -
    8058 this->name.invalidate();
    -
    8059 this->attributes.clear();
    -
    8060 basic_parser::invalidate();
    -
    8061 }
    -
    8062
    -
    8063 html_sequence_t type;
    - -
    8065 std::vector<html_attribute> attributes;
    -
    8066
    -
    8067 protected:
    -
    8068 virtual bool do_match(
    -
    8069 _In_reads_or_z_opt_(end) const T* text,
    -
    8070 _In_ size_t start = 0,
    -
    8071 _In_ size_t end = SIZE_MAX,
    -
    8072 _In_ int flags = match_multiline)
    -
    8073 {
    -
    8074 _Assume_(text || start >= end);
    -
    8075 if (start >= end || text[start] != '<')
    -
    8076 goto error;
    -
    8077 this->interval.end = start + 1;
    -
    8078 if (this->interval.end >= end || !text[this->interval.end])
    -
    8079 goto error;
    -
    8080 if (text[this->interval.end] == '/' &&
    -
    8081 this->m_ident.match(text, this->interval.end + 1, end, flags))
    -
    8082 {
    -
    8083 // </...
    -
    8084 this->type = html_sequence_t::element_end;
    -
    8085 this->name = this->m_ident.interval;
    -
    8086 this->interval.end = this->m_ident.interval.end;
    -
    8087 }
    -
    8088 else if (text[this->interval.end] == '!') {
    -
    8089 // <!...
    -
    8090 this->interval.end++;
    -
    8091 if (this->interval.end + 1 < end &&
    -
    8092 text[this->interval.end] == '-' &&
    -
    8093 text[this->interval.end + 1] == '-')
    -
    8094 {
    -
    8095 // <!--...
    -
    8096 this->name.start = this->interval.end = this->interval.end + 2;
    -
    8097 for (;;) {
    -
    8098 if (this->interval.end >= end || !text[this->interval.end])
    -
    8099 goto error;
    -
    8100 if (this->interval.end + 2 < end &&
    -
    8101 text[this->interval.end] == '-' &&
    -
    8102 text[this->interval.end + 1] == '-' &&
    -
    8103 text[this->interval.end + 2] == '>')
    -
    8104 {
    -
    8105 // <!--...-->
    -
    8106 this->type = html_sequence_t::comment;
    -
    8107 this->name.end = this->interval.end;
    -
    8108 this->attributes.clear();
    -
    8109 this->interval.start = start;
    -
    8110 this->interval.end = this->interval.end + 3;
    -
    8111 return true;
    -
    8112 }
    -
    8113 this->interval.end++;
    -
    8114 }
    -
    8115 }
    -
    8116 this->type = html_sequence_t::declaration;
    -
    8117 this->name.start = this->name.end = this->interval.end;
    -
    8118 }
    -
    8119 else if (text[this->interval.end] == '?') {
    -
    8120 // <?...
    -
    8121 this->name.start = ++this->interval.end;
    -
    8122 for (;;) {
    -
    8123 if (this->interval.end >= end || !text[this->interval.end])
    -
    8124 goto error;
    -
    8125 if (text[this->interval.end] == '>') {
    -
    8126 // <?...>
    -
    8127 this->type = html_sequence_t::instruction;
    -
    8128 this->name.end = this->interval.end;
    -
    8129 this->attributes.clear();
    -
    8130 this->interval.start = start;
    -
    8131 this->interval.end++;
    -
    8132 return true;
    -
    8133 }
    -
    8134 if (this->interval.end + 1 < end &&
    -
    8135 text[this->interval.end] == '?' &&
    -
    8136 text[this->interval.end + 1] == '>')
    -
    8137 {
    -
    8138 // <?...?>
    -
    8139 this->type = html_sequence_t::instruction;
    -
    8140 this->name.end = this->interval.end;
    -
    8141 this->attributes.clear();
    -
    8142 this->interval.start = start;
    -
    8143 this->interval.end = this->interval.end + 2;
    -
    8144 return true;
    -
    8145 }
    -
    8146 this->interval.end++;
    -
    8147 }
    -
    8148 }
    -
    8149 else if (this->m_ident.match(text, this->interval.end, end, flags)) {
    -
    8150 // <tag...
    -
    8151 this->type = html_sequence_t::element_start;
    -
    8152 this->name = this->m_ident.interval;
    -
    8153 this->interval.end = this->m_ident.interval.end;
    -
    8154 }
    -
    8155 else
    -
    8156 goto error;
    -
    8157
    -
    8158 // Skip whitespace.
    -
    8159 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    8160 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8161
    -
    8162 this->attributes.clear();
    -
    8163 for (;;) {
    -
    8164 if (this->type == html_sequence_t::element_start &&
    -
    8165 this->interval.end + 1 < end &&
    -
    8166 text[this->interval.end] == '/' &&
    -
    8167 text[this->interval.end + 1] == '>')
    -
    8168 {
    -
    8169 // <tag .../>
    -
    8170 this->type = html_sequence_t::element;
    -
    8171 this->interval.end = this->interval.end + 2;
    -
    8172 break;
    -
    8173 }
    -
    8174 if (this->interval.end < end &&
    -
    8175 text[this->interval.end] == '>')
    -
    8176 {
    -
    8177 // <tag ...>
    -
    8178 this->interval.end++;
    -
    8179 break;
    -
    8180 }
    -
    8181 if (this->type == html_sequence_t::declaration &&
    -
    8182 this->interval.end + 1 < end &&
    -
    8183 text[this->interval.end] == '!' &&
    -
    8184 text[this->interval.end + 1] == '>')
    -
    8185 {
    -
    8186 // "<!...!>".
    -
    8187 this->interval.end = this->interval.end + 2;
    -
    8188 break;
    -
    8189 }
    -
    8190 if (this->type == html_sequence_t::declaration &&
    -
    8191 this->interval.end + 1 < end &&
    -
    8192 text[this->interval.end] == '-' &&
    -
    8193 text[this->interval.end + 1] == '-')
    -
    8194 {
    -
    8195 // "<! ... --...".
    -
    8196 this->interval.end = this->interval.end + 2;
    -
    8197 for (;;) {
    -
    8198 if (this->interval.end >= end || !text[this->interval.end])
    -
    8199 goto error;
    -
    8200 if (this->interval.end + 1 < end &&
    -
    8201 text[this->interval.end] == '-' &&
    -
    8202 text[this->interval.end + 1] == '-')
    -
    8203 {
    -
    8204 // "<! ... --...--".
    -
    8205 this->interval.end = this->interval.end + 2;
    -
    8206 break;
    -
    8207 }
    -
    8208 this->interval.end++;
    -
    8209 }
    -
    8210
    -
    8211 // Skip whitespace.
    -
    8212 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8213 continue;
    -
    8214 }
    -
    8215
    -
    8216 if (this->interval.end >= end || !text[this->interval.end])
    -
    8217 goto error;
    -
    8218
    -
    8219 // Attributes follow...
    -
    8220 html_attribute* a = nullptr;
    -
    8221 if (this->m_ident.match(text, this->interval.end, end, flags)) {
    -
    8222 this->attributes.push_back(std::move(html_attribute{ this->m_ident.interval }));
    -
    8223 a = &this->attributes.back();
    -
    8224 _Assume_(a);
    -
    8225 this->interval.end = this->m_ident.interval.end;
    -
    8226 }
    -
    8227 else {
    -
    8228 // What was that?! Skip.
    -
    8229 this->interval.end++;
    -
    8230 continue;
    -
    8231 }
    -
    8232
    -
    8233 // Skip whitespace.
    -
    8234 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8235
    -
    8236 if (this->interval.end < end && text[this->interval.end] == '=') {
    -
    8237 this->interval.end++;
    -
    8238
    -
    8239 // Skip whitespace.
    -
    8240 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8241
    -
    8242 if (this->m_value.match(text, this->interval.end, end, flags)) {
    -
    8243 // This attribute has value.
    -
    8244 a->value = this->m_value.content;
    -
    8245 this->interval.end = this->m_value.interval.end;
    -
    8246
    -
    8247 // Skip whitespace.
    -
    8248 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8249 }
    -
    8250 }
    -
    8251 else {
    -
    8252 // This attribute has no value.
    -
    8253 a->value.invalidate();
    -
    8254 }
    -
    8255 }
    -
    8256
    -
    8257 this->interval.start = start;
    -
    8258 return true;
    -
    8259
    -
    8260 error:
    -
    8261 invalidate();
    -
    8262 return false;
    -
    8263 }
    -
    8264
    -
    8265 basic_html_ident<T> m_ident;
    -
    8266 basic_html_value<T> m_value;
    -
    8267 };
    +
    8043
    +
    8047 template <class T>
    +
    + +
    8049 {
    +
    8050 public:
    +
    8051 basic_html_tag(_In_ const std::locale& locale = std::locale()) :
    + +
    8053 type(html_sequence_t::unknown)
    +
    8054 {}
    +
    8055
    +
    8056 virtual void invalidate()
    +
    8057 {
    +
    8058 this->type = html_sequence_t::unknown;
    +
    8059 this->name.invalidate();
    +
    8060 this->attributes.clear();
    +
    8061 basic_parser::invalidate();
    +
    8062 }
    +
    8063
    +
    8064 html_sequence_t type;
    + +
    8066 std::vector<html_attribute> attributes;
    +
    8067
    +
    8068 protected:
    +
    8069 virtual bool do_match(
    +
    8070 _In_reads_or_z_opt_(end) const T* text,
    +
    8071 _In_ size_t start = 0,
    +
    8072 _In_ size_t end = SIZE_MAX,
    +
    8073 _In_ int flags = match_multiline)
    +
    8074 {
    +
    8075 _Assume_(text || start >= end);
    +
    8076 if (start >= end || text[start] != '<')
    +
    8077 goto error;
    +
    8078 this->interval.end = start + 1;
    +
    8079 if (this->interval.end >= end || !text[this->interval.end])
    +
    8080 goto error;
    +
    8081 if (text[this->interval.end] == '/' &&
    +
    8082 this->m_ident.match(text, this->interval.end + 1, end, flags))
    +
    8083 {
    +
    8084 // </...
    +
    8085 this->type = html_sequence_t::element_end;
    +
    8086 this->name = this->m_ident.interval;
    +
    8087 this->interval.end = this->m_ident.interval.end;
    +
    8088 }
    +
    8089 else if (text[this->interval.end] == '!') {
    +
    8090 // <!...
    +
    8091 this->interval.end++;
    +
    8092 if (this->interval.end + 1 < end &&
    +
    8093 text[this->interval.end] == '-' &&
    +
    8094 text[this->interval.end + 1] == '-')
    +
    8095 {
    +
    8096 // <!--...
    +
    8097 this->name.start = this->interval.end = this->interval.end + 2;
    +
    8098 for (;;) {
    +
    8099 if (this->interval.end >= end || !text[this->interval.end])
    +
    8100 goto error;
    +
    8101 if (this->interval.end + 2 < end &&
    +
    8102 text[this->interval.end] == '-' &&
    +
    8103 text[this->interval.end + 1] == '-' &&
    +
    8104 text[this->interval.end + 2] == '>')
    +
    8105 {
    +
    8106 // <!--...-->
    +
    8107 this->type = html_sequence_t::comment;
    +
    8108 this->name.end = this->interval.end;
    +
    8109 this->attributes.clear();
    +
    8110 this->interval.start = start;
    +
    8111 this->interval.end = this->interval.end + 3;
    +
    8112 return true;
    +
    8113 }
    +
    8114 this->interval.end++;
    +
    8115 }
    +
    8116 }
    +
    8117 this->type = html_sequence_t::declaration;
    +
    8118 this->name.start = this->name.end = this->interval.end;
    +
    8119 }
    +
    8120 else if (text[this->interval.end] == '?') {
    +
    8121 // <?...
    +
    8122 this->name.start = ++this->interval.end;
    +
    8123 for (;;) {
    +
    8124 if (this->interval.end >= end || !text[this->interval.end])
    +
    8125 goto error;
    +
    8126 if (text[this->interval.end] == '>') {
    +
    8127 // <?...>
    +
    8128 this->type = html_sequence_t::instruction;
    +
    8129 this->name.end = this->interval.end;
    +
    8130 this->attributes.clear();
    +
    8131 this->interval.start = start;
    +
    8132 this->interval.end++;
    +
    8133 return true;
    +
    8134 }
    +
    8135 if (this->interval.end + 1 < end &&
    +
    8136 text[this->interval.end] == '?' &&
    +
    8137 text[this->interval.end + 1] == '>')
    +
    8138 {
    +
    8139 // <?...?>
    +
    8140 this->type = html_sequence_t::instruction;
    +
    8141 this->name.end = this->interval.end;
    +
    8142 this->attributes.clear();
    +
    8143 this->interval.start = start;
    +
    8144 this->interval.end = this->interval.end + 2;
    +
    8145 return true;
    +
    8146 }
    +
    8147 this->interval.end++;
    +
    8148 }
    +
    8149 }
    +
    8150 else if (this->m_ident.match(text, this->interval.end, end, flags)) {
    +
    8151 // <tag...
    +
    8152 this->type = html_sequence_t::element_start;
    +
    8153 this->name = this->m_ident.interval;
    +
    8154 this->interval.end = this->m_ident.interval.end;
    +
    8155 }
    +
    8156 else
    +
    8157 goto error;
    +
    8158
    +
    8159 // Skip whitespace.
    +
    8160 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    8161 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8162
    +
    8163 this->attributes.clear();
    +
    8164 for (;;) {
    +
    8165 if (this->type == html_sequence_t::element_start &&
    +
    8166 this->interval.end + 1 < end &&
    +
    8167 text[this->interval.end] == '/' &&
    +
    8168 text[this->interval.end + 1] == '>')
    +
    8169 {
    +
    8170 // <tag .../>
    +
    8171 this->type = html_sequence_t::element;
    +
    8172 this->interval.end = this->interval.end + 2;
    +
    8173 break;
    +
    8174 }
    +
    8175 if (this->interval.end < end &&
    +
    8176 text[this->interval.end] == '>')
    +
    8177 {
    +
    8178 // <tag ...>
    +
    8179 this->interval.end++;
    +
    8180 break;
    +
    8181 }
    +
    8182 if (this->type == html_sequence_t::declaration &&
    +
    8183 this->interval.end + 1 < end &&
    +
    8184 text[this->interval.end] == '!' &&
    +
    8185 text[this->interval.end + 1] == '>')
    +
    8186 {
    +
    8187 // "<!...!>".
    +
    8188 this->interval.end = this->interval.end + 2;
    +
    8189 break;
    +
    8190 }
    +
    8191 if (this->type == html_sequence_t::declaration &&
    +
    8192 this->interval.end + 1 < end &&
    +
    8193 text[this->interval.end] == '-' &&
    +
    8194 text[this->interval.end + 1] == '-')
    +
    8195 {
    +
    8196 // "<! ... --...".
    +
    8197 this->interval.end = this->interval.end + 2;
    +
    8198 for (;;) {
    +
    8199 if (this->interval.end >= end || !text[this->interval.end])
    +
    8200 goto error;
    +
    8201 if (this->interval.end + 1 < end &&
    +
    8202 text[this->interval.end] == '-' &&
    +
    8203 text[this->interval.end + 1] == '-')
    +
    8204 {
    +
    8205 // "<! ... --...--".
    +
    8206 this->interval.end = this->interval.end + 2;
    +
    8207 break;
    +
    8208 }
    +
    8209 this->interval.end++;
    +
    8210 }
    +
    8211
    +
    8212 // Skip whitespace.
    +
    8213 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8214 continue;
    +
    8215 }
    +
    8216
    +
    8217 if (this->interval.end >= end || !text[this->interval.end])
    +
    8218 goto error;
    +
    8219
    +
    8220 // Attributes follow...
    +
    8221 html_attribute* a = nullptr;
    +
    8222 if (this->m_ident.match(text, this->interval.end, end, flags)) {
    +
    8223 this->attributes.push_back(std::move(html_attribute{ this->m_ident.interval }));
    +
    8224 a = &this->attributes.back();
    +
    8225 _Assume_(a);
    +
    8226 this->interval.end = this->m_ident.interval.end;
    +
    8227 }
    +
    8228 else {
    +
    8229 // What was that?! Skip.
    +
    8230 this->interval.end++;
    +
    8231 continue;
    +
    8232 }
    +
    8233
    +
    8234 // Skip whitespace.
    +
    8235 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8236
    +
    8237 if (this->interval.end < end && text[this->interval.end] == '=') {
    +
    8238 this->interval.end++;
    +
    8239
    +
    8240 // Skip whitespace.
    +
    8241 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8242
    +
    8243 if (this->m_value.match(text, this->interval.end, end, flags)) {
    +
    8244 // This attribute has value.
    +
    8245 a->value = this->m_value.content;
    +
    8246 this->interval.end = this->m_value.interval.end;
    +
    8247
    +
    8248 // Skip whitespace.
    +
    8249 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8250 }
    +
    8251 }
    +
    8252 else {
    +
    8253 // This attribute has no value.
    +
    8254 a->value.invalidate();
    +
    8255 }
    +
    8256 }
    +
    8257
    +
    8258 this->interval.start = start;
    +
    8259 return true;
    +
    8260
    +
    8261 error:
    +
    8262 invalidate();
    +
    8263 return false;
    +
    8264 }
    +
    8265
    +
    8266 basic_html_ident<T> m_ident;
    +
    8267 basic_html_value<T> m_value;
    +
    8268 };
    -
    8268
    -
    8269 using html_tag = basic_html_tag<char>;
    -
    8270 using whtml_tag = basic_html_tag<wchar_t>;
    -
    8271#ifdef _UNICODE
    -
    8272 using thtml_tag = whtml_tag;
    -
    8273#else
    -
    8274 using thtml_tag = html_tag;
    -
    8275#endif
    -
    8276
    -
    8280 template <class T>
    -
    - -
    8282 {
    -
    8283 public:
    -
    8284 virtual void invalidate()
    -
    8285 {
    -
    8286 this->condition.invalidate();
    -
    8287 basic_parser::invalidate();
    -
    8288 }
    -
    8289
    -
    8290 stdex::interval<size_t> condition;
    -
    8291
    -
    8292 protected:
    -
    -
    8293 virtual bool do_match(
    -
    8294 _In_reads_or_z_opt_(end) const T* text,
    -
    8295 _In_ size_t start = 0,
    -
    8296 _In_ size_t end = SIZE_MAX,
    -
    8297 _In_ int flags = match_multiline)
    -
    8298 {
    -
    8299 _Unreferenced_(flags);
    -
    8300 _Assume_(text || start + 2 >= end);
    -
    8301 if (start + 2 < end &&
    -
    8302 text[start] == '<' &&
    -
    8303 text[start + 1] == '!' &&
    -
    8304 text[start + 2] == '[')
    -
    8305 {
    -
    8306 this->interval.end = start + 3;
    -
    8307
    -
    8308 // Skip whitespace.
    -
    8309 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    -
    8310 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    -
    8311
    -
    8312 this->condition.start = this->condition.end = this->interval.end;
    -
    8313
    -
    8314 for (;;) {
    -
    8315 if (this->interval.end >= end || !text[this->interval.end])
    -
    8316 break;
    -
    8317 if (text[this->interval.end] == '[') {
    -
    8318 this->interval.start = start;
    -
    8319 this->interval.end++;
    -
    8320 return true;
    -
    8321 }
    -
    8322 if (ctype.is(ctype.space, text[this->interval.end]))
    -
    8323 this->interval.end++;
    -
    8324 else
    -
    8325 this->condition.end = ++this->interval.end;
    -
    8326 }
    -
    8327 }
    -
    8328
    -
    8329 this->condition.invalidate();
    -
    8330 this->interval.invalidate();
    -
    8331 return false;
    -
    8332 }
    +
    8269
    +
    8270 using html_tag = basic_html_tag<char>;
    +
    8271 using whtml_tag = basic_html_tag<wchar_t>;
    +
    8272#ifdef _UNICODE
    +
    8273 using thtml_tag = whtml_tag;
    +
    8274#else
    +
    8275 using thtml_tag = html_tag;
    +
    8276#endif
    +
    8277
    +
    8281 template <class T>
    +
    + +
    8283 {
    +
    8284 public:
    +
    8285 virtual void invalidate()
    +
    8286 {
    +
    8287 this->condition.invalidate();
    +
    8288 basic_parser::invalidate();
    +
    8289 }
    +
    8290
    +
    8291 stdex::interval<size_t> condition;
    +
    8292
    +
    8293 protected:
    +
    +
    8294 virtual bool do_match(
    +
    8295 _In_reads_or_z_opt_(end) const T* text,
    +
    8296 _In_ size_t start = 0,
    +
    8297 _In_ size_t end = SIZE_MAX,
    +
    8298 _In_ int flags = match_multiline)
    +
    8299 {
    +
    8300 _Unreferenced_(flags);
    +
    8301 _Assume_(text || start + 2 >= end);
    +
    8302 if (start + 2 < end &&
    +
    8303 text[start] == '<' &&
    +
    8304 text[start + 1] == '!' &&
    +
    8305 text[start + 2] == '[')
    +
    8306 {
    +
    8307 this->interval.end = start + 3;
    +
    8308
    +
    8309 // Skip whitespace.
    +
    8310 const auto& ctype = std::use_facet<std::ctype<T>>(m_locale);
    +
    8311 for (; this->interval.end < end && text[this->interval.end] && ctype.is(ctype.space, text[this->interval.end]); this->interval.end++);
    +
    8312
    +
    8313 this->condition.start = this->condition.end = this->interval.end;
    +
    8314
    +
    8315 for (;;) {
    +
    8316 if (this->interval.end >= end || !text[this->interval.end])
    +
    8317 break;
    +
    8318 if (text[this->interval.end] == '[') {
    +
    8319 this->interval.start = start;
    +
    8320 this->interval.end++;
    +
    8321 return true;
    +
    8322 }
    +
    8323 if (ctype.is(ctype.space, text[this->interval.end]))
    +
    8324 this->interval.end++;
    +
    8325 else
    +
    8326 this->condition.end = ++this->interval.end;
    +
    8327 }
    +
    8328 }
    +
    8329
    +
    8330 this->condition.invalidate();
    +
    8331 this->interval.invalidate();
    +
    8332 return false;
    +
    8333 }
    -
    8333 };
    +
    8334 };
    -
    8334
    -
    8335 using html_declaration_condition_start = basic_html_declaration_condition_start<char>;
    -
    8336 using whtml_declaration_condition_start = basic_html_declaration_condition_start<wchar_t>;
    -
    8337#ifdef _UNICODE
    -
    8338 using thtml_declaration_condition_start = whtml_declaration_condition_start;
    -
    8339#else
    -
    8340 using thtml_declaration_condition_start = html_declaration_condition_start;
    -
    8341#endif
    -
    8342
    -
    8346 template <class T>
    -
    - -
    8348 {
    -
    8349 protected:
    -
    8350 virtual bool do_match(
    -
    8351 _In_reads_or_z_opt_(end) const T* text,
    -
    8352 _In_ size_t start = 0,
    -
    8353 _In_ size_t end = SIZE_MAX,
    -
    8354 _In_ int flags = match_multiline)
    -
    8355 {
    -
    8356 _Unreferenced_(flags);
    -
    8357 _Assume_(text || start + 2 >= end);
    -
    8358 if (start + 2 < end &&
    -
    8359 text[start] == ']' &&
    -
    8360 text[start + 1] == ']' &&
    -
    8361 text[start + 2] == '>')
    -
    8362 {
    -
    8363 this->interval.start = start;
    -
    8364 this->interval.end = start + 3;
    -
    8365 return true;
    -
    8366 }
    -
    8367 this->interval.invalidate();
    -
    8368 return false;
    -
    8369 }
    -
    8370 };
    +
    8335
    +
    8336 using html_declaration_condition_start = basic_html_declaration_condition_start<char>;
    +
    8337 using whtml_declaration_condition_start = basic_html_declaration_condition_start<wchar_t>;
    +
    8338#ifdef _UNICODE
    +
    8339 using thtml_declaration_condition_start = whtml_declaration_condition_start;
    +
    8340#else
    +
    8341 using thtml_declaration_condition_start = html_declaration_condition_start;
    +
    8342#endif
    +
    8343
    +
    8347 template <class T>
    +
    + +
    8349 {
    +
    8350 protected:
    +
    8351 virtual bool do_match(
    +
    8352 _In_reads_or_z_opt_(end) const T* text,
    +
    8353 _In_ size_t start = 0,
    +
    8354 _In_ size_t end = SIZE_MAX,
    +
    8355 _In_ int flags = match_multiline)
    +
    8356 {
    +
    8357 _Unreferenced_(flags);
    +
    8358 _Assume_(text || start + 2 >= end);
    +
    8359 if (start + 2 < end &&
    +
    8360 text[start] == ']' &&
    +
    8361 text[start + 1] == ']' &&
    +
    8362 text[start + 2] == '>')
    +
    8363 {
    +
    8364 this->interval.start = start;
    +
    8365 this->interval.end = start + 3;
    +
    8366 return true;
    +
    8367 }
    +
    8368 this->interval.invalidate();
    +
    8369 return false;
    +
    8370 }
    +
    8371 };
    -
    8371
    - - -
    8374#ifdef _UNICODE
    - -
    8376#else
    - -
    8378#endif
    -
    8379 }
    -
    8380}
    -
    8381
    -
    8382#undef ENUM_FLAG_OPERATOR
    -
    8383#undef ENUM_FLAGS
    -
    8384
    -
    8385#ifdef _MSC_VER
    -
    8386#pragma warning(pop)
    -
    8387#endif
    +
    8372
    + + +
    8375#ifdef _UNICODE
    + +
    8377#else
    + +
    8379#endif
    +
    8380 }
    +
    8381}
    +
    8382
    +
    8383#undef ENUM_FLAG_OPERATOR
    +
    8384#undef ENUM_FLAGS
    +
    8385
    +
    8386#ifdef _MSC_VER
    +
    8387#pragma warning(pop)
    +
    8388#endif
    locale_t helper class to free_locale when going out of scope.
    Definition locale.hpp:69
    -
    Test for angle in d°mm'ss.dddd form.
    Definition parser.hpp:4375
    +
    Test for angle in d°mm'ss.dddd form.
    Definition parser.hpp:4376
    Test for any code unit.
    Definition parser.hpp:231
    Test for beginning of line.
    Definition parser.hpp:630
    Test for any.
    Definition parser.hpp:1073
    -
    Test for chemical formula.
    Definition parser.hpp:5504
    -
    Test for Creditor Reference.
    Definition parser.hpp:4939
    -
    T reference[22]
    Normalized national reference number.
    Definition parser.hpp:4961
    -
    T check_digits[3]
    Two check digits.
    Definition parser.hpp:4960
    -
    bool is_valid
    Is reference valid per ISO 7064.
    Definition parser.hpp:4962
    -
    Legacy CSS comment end -->
    Definition parser.hpp:7465
    -
    Legacy CSS comment start <!--
    Definition parser.hpp:7427
    -
    CSS comment.
    Definition parser.hpp:7367
    -
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7375
    -
    CSS import directive.
    Definition parser.hpp:7679
    -
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7687
    -
    CSS string.
    Definition parser.hpp:7502
    -
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7510
    -
    URI in CSS.
    Definition parser.hpp:7569
    -
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7577
    +
    Test for chemical formula.
    Definition parser.hpp:5505
    +
    Test for Creditor Reference.
    Definition parser.hpp:4940
    +
    T reference[22]
    Normalized national reference number.
    Definition parser.hpp:4962
    +
    T check_digits[3]
    Two check digits.
    Definition parser.hpp:4961
    +
    bool is_valid
    Is reference valid per ISO 7064.
    Definition parser.hpp:4963
    +
    Legacy CSS comment end -->
    Definition parser.hpp:7466
    +
    Legacy CSS comment start <!--
    Definition parser.hpp:7428
    +
    CSS comment.
    Definition parser.hpp:7368
    +
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7376
    +
    CSS import directive.
    Definition parser.hpp:7680
    +
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7688
    +
    CSS string.
    Definition parser.hpp:7503
    +
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7511
    +
    URI in CSS.
    Definition parser.hpp:7570
    +
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7578
    Test for any code unit from a given string of code units.
    Definition parser.hpp:735
    Test for specific code unit.
    Definition parser.hpp:303
    -
    Test for date.
    Definition parser.hpp:4008
    -
    Test for valid DNS domain character.
    Definition parser.hpp:2790
    -
    bool allow_on_edge
    Is character allowed at the beginning or an end of a DNS domain?
    Definition parser.hpp:2800
    -
    Test for DNS domain/hostname.
    Definition parser.hpp:2890
    -
    bool m_allow_absolute
    May DNS names end with a dot (absolute name)?
    Definition parser.hpp:2954
    -
    Test for e-mail address.
    Definition parser.hpp:3782
    -
    Test for emoticon.
    Definition parser.hpp:3885
    -
    std::shared_ptr< basic_parser< T > > apex
    apex/eyebrows/halo (e.g. O, 0)
    Definition parser.hpp:3913
    -
    std::shared_ptr< basic_parser< T > > eyes
    eyes (e.g. :, ;, >, |, B)
    Definition parser.hpp:3914
    -
    std::shared_ptr< basic_set< T > > mouth
    mouth (e.g. ), ), (, (, |, P, D, p, d)
    Definition parser.hpp:3916
    -
    std::shared_ptr< basic_parser< T > > nose
    nose (e.g. -, o)
    Definition parser.hpp:3915
    -
    std::shared_ptr< basic_parser< T > > emoticon
    emoticon as a whole (e.g. 😀, 🤔, 😶)
    Definition parser.hpp:3912
    +
    Test for date.
    Definition parser.hpp:4009
    +
    Test for valid DNS domain character.
    Definition parser.hpp:2791
    +
    bool allow_on_edge
    Is character allowed at the beginning or an end of a DNS domain?
    Definition parser.hpp:2801
    +
    Test for DNS domain/hostname.
    Definition parser.hpp:2891
    +
    bool m_allow_absolute
    May DNS names end with a dot (absolute name)?
    Definition parser.hpp:2955
    +
    Test for e-mail address.
    Definition parser.hpp:3783
    +
    Test for emoticon.
    Definition parser.hpp:3886
    +
    std::shared_ptr< basic_parser< T > > apex
    apex/eyebrows/halo (e.g. O, 0)
    Definition parser.hpp:3914
    +
    std::shared_ptr< basic_parser< T > > eyes
    eyes (e.g. :, ;, >, |, B)
    Definition parser.hpp:3915
    +
    std::shared_ptr< basic_set< T > > mouth
    mouth (e.g. ), ), (, (, |, P, D, p, d)
    Definition parser.hpp:3917
    +
    std::shared_ptr< basic_parser< T > > nose
    nose (e.g. -, o)
    Definition parser.hpp:3916
    +
    std::shared_ptr< basic_parser< T > > emoticon
    emoticon as a whole (e.g. 😀, 🤔, 😶)
    Definition parser.hpp:3913
    Test for end of line.
    Definition parser.hpp:669
    Test for fraction.
    Definition parser.hpp:1701
    -
    End of condition ...]]>
    Definition parser.hpp:8348
    -
    Start of condition <![condition[...
    Definition parser.hpp:8282
    -
    virtual bool do_match(_In_reads_or_z_opt_(end) const T *text, size_t start=0, size_t end=SIZE_MAX, int flags=match_multiline)
    condition position in source
    Definition parser.hpp:8293
    -
    Contiguous sequence of characters representing name of element, attribute etc.
    Definition parser.hpp:7896
    -
    Tag.
    Definition parser.hpp:8048
    -
    std::vector< html_attribute > attributes
    tag attributes
    Definition parser.hpp:8065
    -
    html_sequence_t type
    tag type
    Definition parser.hpp:8063
    -
    stdex::interval< size_t > name
    tag name position in source
    Definition parser.hpp:8064
    -
    Optionally-quoted string representing value of an attribute.
    Definition parser.hpp:7943
    -
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7951
    -
    Test for International Bank Account Number.
    Definition parser.hpp:4650
    -
    T bban[31]
    Normalized Basic Bank Account Number.
    Definition parser.hpp:4675
    -
    T country[3]
    ISO 3166-1 alpha-2 country code.
    Definition parser.hpp:4673
    -
    T check_digits[3]
    Two check digits.
    Definition parser.hpp:4674
    -
    bool is_valid
    Is IBAN valid per ISO 7064.
    Definition parser.hpp:4676
    +
    End of condition ...]]>
    Definition parser.hpp:8349
    +
    Start of condition <![condition[...
    Definition parser.hpp:8283
    +
    virtual bool do_match(_In_reads_or_z_opt_(end) const T *text, size_t start=0, size_t end=SIZE_MAX, int flags=match_multiline)
    condition position in source
    Definition parser.hpp:8294
    +
    Contiguous sequence of characters representing name of element, attribute etc.
    Definition parser.hpp:7897
    +
    Tag.
    Definition parser.hpp:8049
    +
    std::vector< html_attribute > attributes
    tag attributes
    Definition parser.hpp:8066
    +
    html_sequence_t type
    tag type
    Definition parser.hpp:8064
    +
    stdex::interval< size_t > name
    tag name position in source
    Definition parser.hpp:8065
    +
    Optionally-quoted string representing value of an attribute.
    Definition parser.hpp:7944
    +
    stdex::interval< size_t > content
    content position in source
    Definition parser.hpp:7952
    +
    Test for International Bank Account Number.
    Definition parser.hpp:4651
    +
    T bban[31]
    Normalized Basic Bank Account Number.
    Definition parser.hpp:4676
    +
    T country[3]
    ISO 3166-1 alpha-2 country code.
    Definition parser.hpp:4674
    +
    T check_digits[3]
    Two check digits.
    Definition parser.hpp:4675
    +
    bool is_valid
    Is IBAN valid per ISO 7064.
    Definition parser.hpp:4677
    Test for decimal integer.
    Definition parser.hpp:1311
    Test for decimal integer possibly containing thousand separators.
    Definition parser.hpp:1396
    bool has_separators
    Did integer have any separators?
    Definition parser.hpp:1417
    @@ -8409,21 +8410,21 @@ $(function() { codefold.init(0); });
    Test for IPv4 address.
    Definition parser.hpp:2359
    stdex::interval< size_t > components[4]
    Individual component intervals.
    Definition parser.hpp:2404
    struct in_addr value
    IPv4 address value.
    Definition parser.hpp:2405
    -
    Test for IPv6 address.
    Definition parser.hpp:2570
    -
    std::shared_ptr< basic_parser< T > > scope_id
    Scope ID (e.g. NIC index with link-local addresses)
    Definition parser.hpp:2642
    -
    stdex::interval< size_t > components[8]
    Individual component intervals.
    Definition parser.hpp:2640
    -
    struct in6_addr value
    IPv6 address value.
    Definition parser.hpp:2641
    -
    Test for valid IPv6 address scope ID character.
    Definition parser.hpp:2496
    +
    Test for IPv6 address.
    Definition parser.hpp:2571
    +
    std::shared_ptr< basic_parser< T > > scope_id
    Scope ID (e.g. NIC index with link-local addresses)
    Definition parser.hpp:2643
    +
    stdex::interval< size_t > components[8]
    Individual component intervals.
    Definition parser.hpp:2641
    +
    struct in6_addr value
    IPv6 address value.
    Definition parser.hpp:2642
    +
    Test for valid IPv6 address scope ID character.
    Definition parser.hpp:2497
    Test for repeating.
    Definition parser.hpp:925
    bool m_greedy
    try to match as long sequence as possible
    Definition parser.hpp:964
    std::shared_ptr< basic_parser< T > > m_el
    repeating element
    Definition parser.hpp:961
    size_t m_min_iterations
    minimum number of iterations
    Definition parser.hpp:962
    size_t m_max_iterations
    maximum number of iterations
    Definition parser.hpp:963
    -
    Test for JSON string.
    Definition parser.hpp:7215
    -
    MIME content type.
    Definition parser.hpp:7763
    -
    stdex::interval< size_t > base_type
    basic type position in source
    Definition parser.hpp:7773
    -
    stdex::interval< size_t > sub_type
    sub-type position in source
    Definition parser.hpp:7774
    -
    stdex::interval< size_t > charset
    charset position in source
    Definition parser.hpp:7775
    +
    Test for JSON string.
    Definition parser.hpp:7216
    +
    MIME content type.
    Definition parser.hpp:7764
    +
    stdex::interval< size_t > base_type
    basic type position in source
    Definition parser.hpp:7774
    +
    stdex::interval< size_t > sub_type
    sub-type position in source
    Definition parser.hpp:7775
    +
    stdex::interval< size_t > charset
    charset position in source
    Definition parser.hpp:7776
    Test for mixed numeral.
    Definition parser.hpp:1936
    std::shared_ptr< basic_parser< T > > fraction
    fraction
    Definition parser.hpp:1969
    std::shared_ptr< basic_parser< T > > special_sign
    Special sign (e.g. plus-minus '±')
    Definition parser.hpp:1967
    @@ -8442,8 +8443,8 @@ $(function() { codefold.init(0); });
    Base template for all parsers.
    Definition parser.hpp:75
    stdex::interval< size_t > interval
    Region of the last match.
    Definition parser.hpp:115
    Test for permutation.
    Definition parser.hpp:1213
    -
    Test for phone number.
    Definition parser.hpp:4498
    -
    std::basic_string< T > value
    Normalized phone number.
    Definition parser.hpp:4523
    +
    Test for phone number.
    Definition parser.hpp:4499
    +
    std::basic_string< T > value
    Normalized phone number.
    Definition parser.hpp:4524
    Test for any punctuation code unit.
    Definition parser.hpp:476
    Test for Roman numeral.
    Definition parser.hpp:1585
    Test for scientific numeral.
    Definition parser.hpp:2061
    @@ -8461,14 +8462,14 @@ $(function() { codefold.init(0); });
    Test for match score.
    Definition parser.hpp:1764
    Test for sequence.
    Definition parser.hpp:1021
    Definition parser.hpp:704
    -
    Test for SI Reference delimiter.
    Definition parser.hpp:5133
    -
    Test for SI Reference part.
    Definition parser.hpp:5087
    -
    Test for SI Reference.
    Definition parser.hpp:5172
    -
    basic_si_reference_part< T > part3
    Reference data part 3 (P3)
    Definition parser.hpp:5201
    -
    basic_si_reference_part< T > part1
    Reference data part 1 (P1)
    Definition parser.hpp:5199
    -
    bool is_valid
    Is reference valid.
    Definition parser.hpp:5202
    -
    T model[3]
    Reference model.
    Definition parser.hpp:5198
    -
    basic_si_reference_part< T > part2
    Reference data part 2 (P2)
    Definition parser.hpp:5200
    +
    Test for SI Reference delimiter.
    Definition parser.hpp:5134
    +
    Test for SI Reference part.
    Definition parser.hpp:5088
    +
    Test for SI Reference.
    Definition parser.hpp:5173
    +
    basic_si_reference_part< T > part3
    Reference data part 3 (P3)
    Definition parser.hpp:5202
    +
    basic_si_reference_part< T > part1
    Reference data part 1 (P1)
    Definition parser.hpp:5200
    +
    bool is_valid
    Is reference valid.
    Definition parser.hpp:5203
    +
    T model[3]
    Reference model.
    Definition parser.hpp:5199
    +
    basic_si_reference_part< T > part2
    Reference data part 2 (P2)
    Definition parser.hpp:5201
    Test for signed numeral.
    Definition parser.hpp:1850
    std::shared_ptr< basic_parser< T > > special_sign
    Special sign (e.g. plus-minus '±')
    Definition parser.hpp:1876
    std::shared_ptr< basic_parser< T > > negative_sign
    Negative sign.
    Definition parser.hpp:1875
    @@ -8478,77 +8479,77 @@ $(function() { codefold.init(0); });
    Test for any space or punctuation code unit.
    Definition parser.hpp:551
    Test for any string.
    Definition parser.hpp:1141
    Test for given string.
    Definition parser.hpp:830
    -
    Test for time.
    Definition parser.hpp:4273
    -
    Test for valid URL password character.
    Definition parser.hpp:3074
    -
    Test for valid URL path character.
    Definition parser.hpp:3176
    -
    Test for URL path.
    Definition parser.hpp:3286
    -
    Test for valid URL username character.
    Definition parser.hpp:2973
    -
    Test for URL.
    Definition parser.hpp:3426
    -
    Test for HTTP agent.
    Definition parser.hpp:6759
    -
    Test for HTTP any type.
    Definition parser.hpp:5902
    -
    Test for HTTP asterisk.
    Definition parser.hpp:6530
    - - - - - -
    Test for HTTP header.
    Definition parser.hpp:7067
    -
    Test for HTTP language (RFC1766)
    Definition parser.hpp:6398
    -
    Test for HTTP line break (RFC2616: CRLF | LF)
    Definition parser.hpp:5584
    -
    Test for HTTP media range (RFC2616: media-range)
    Definition parser.hpp:5934
    -
    Test for HTTP media type (RFC2616: media-type)
    Definition parser.hpp:5986
    -
    Test for HTTP parameter (RFC2616: parameter)
    Definition parser.hpp:5850
    -
    http_token name
    Parameter name.
    Definition parser.hpp:5859
    -
    http_value value
    Parameter value.
    Definition parser.hpp:5860
    -
    Test for HTTP protocol.
    Definition parser.hpp:6834
    -
    uint16_t version
    HTTP protocol version: 0x100 = 1.0, 0x101 = 1.1...
    Definition parser.hpp:6856
    -
    Test for HTTP quoted string (RFC2616: quoted-string)
    Definition parser.hpp:5743
    -
    stdex::interval< size_t > content
    String content (without quotes)
    Definition parser.hpp:5752
    -
    Test for HTTP request.
    Definition parser.hpp:6935
    -
    Test for HTTP space (RFC2616: LWS)
    Definition parser.hpp:5620
    -
    Test for HTTP text character (RFC2616: TEXT)
    Definition parser.hpp:5656
    -
    Test for HTTP token (RFC2616: token - tolerates non-ASCII)
    Definition parser.hpp:5689
    -
    Test for HTTP URL parameter.
    Definition parser.hpp:6223
    -
    Test for HTTP URL path segment.
    Definition parser.hpp:6135
    -
    Test for HTTP URL path segment.
    Definition parser.hpp:6168
    -
    std::vector< http_url_path_segment > segments
    Path segments.
    Definition parser.hpp:6176
    -
    Test for HTTP URL port.
    Definition parser.hpp:6079
    -
    Test for HTTP URL server.
    Definition parser.hpp:6042
    -
    Test for HTTP URL.
    Definition parser.hpp:6300
    -
    Collection of HTTP values.
    Definition parser.hpp:7171
    -
    Test for HTTP value (RFC2616: value)
    Definition parser.hpp:5806
    -
    http_quoted_string string
    Value when matched as quoted string.
    Definition parser.hpp:5815
    -
    http_token token
    Value when matched as token.
    Definition parser.hpp:5816
    -
    Test for HTTP weight factor.
    Definition parser.hpp:6461
    -
    float value
    Calculated value of the weight factor.
    Definition parser.hpp:6474
    -
    Test for HTTP weighted value.
    Definition parser.hpp:6553
    +
    Test for time.
    Definition parser.hpp:4274
    +
    Test for valid URL password character.
    Definition parser.hpp:3075
    +
    Test for valid URL path character.
    Definition parser.hpp:3177
    +
    Test for URL path.
    Definition parser.hpp:3287
    +
    Test for valid URL username character.
    Definition parser.hpp:2974
    +
    Test for URL.
    Definition parser.hpp:3427
    +
    Test for HTTP agent.
    Definition parser.hpp:6760
    +
    Test for HTTP any type.
    Definition parser.hpp:5903
    +
    Test for HTTP asterisk.
    Definition parser.hpp:6531
    + + + + + +
    Test for HTTP header.
    Definition parser.hpp:7068
    +
    Test for HTTP language (RFC1766)
    Definition parser.hpp:6399
    +
    Test for HTTP line break (RFC2616: CRLF | LF)
    Definition parser.hpp:5585
    +
    Test for HTTP media range (RFC2616: media-range)
    Definition parser.hpp:5935
    +
    Test for HTTP media type (RFC2616: media-type)
    Definition parser.hpp:5987
    +
    Test for HTTP parameter (RFC2616: parameter)
    Definition parser.hpp:5851
    +
    http_token name
    Parameter name.
    Definition parser.hpp:5860
    +
    http_value value
    Parameter value.
    Definition parser.hpp:5861
    +
    Test for HTTP protocol.
    Definition parser.hpp:6835
    +
    uint16_t version
    HTTP protocol version: 0x100 = 1.0, 0x101 = 1.1...
    Definition parser.hpp:6857
    +
    Test for HTTP quoted string (RFC2616: quoted-string)
    Definition parser.hpp:5744
    +
    stdex::interval< size_t > content
    String content (without quotes)
    Definition parser.hpp:5753
    +
    Test for HTTP request.
    Definition parser.hpp:6936
    +
    Test for HTTP space (RFC2616: LWS)
    Definition parser.hpp:5621
    +
    Test for HTTP text character (RFC2616: TEXT)
    Definition parser.hpp:5657
    +
    Test for HTTP token (RFC2616: token - tolerates non-ASCII)
    Definition parser.hpp:5690
    +
    Test for HTTP URL parameter.
    Definition parser.hpp:6224
    +
    Test for HTTP URL path segment.
    Definition parser.hpp:6136
    +
    Test for HTTP URL path segment.
    Definition parser.hpp:6169
    +
    std::vector< http_url_path_segment > segments
    Path segments.
    Definition parser.hpp:6177
    +
    Test for HTTP URL port.
    Definition parser.hpp:6080
    +
    Test for HTTP URL server.
    Definition parser.hpp:6043
    +
    Test for HTTP URL.
    Definition parser.hpp:6301
    +
    Collection of HTTP values.
    Definition parser.hpp:7172
    +
    Test for HTTP value (RFC2616: value)
    Definition parser.hpp:5807
    +
    http_quoted_string string
    Value when matched as quoted string.
    Definition parser.hpp:5816
    +
    http_token token
    Value when matched as token.
    Definition parser.hpp:5817
    +
    Test for HTTP weight factor.
    Definition parser.hpp:6462
    +
    float value
    Calculated value of the weight factor.
    Definition parser.hpp:6475
    +
    Test for HTTP weighted value.
    Definition parser.hpp:6554
    Base template for collection-holding parsers.
    Definition parser.hpp:981
    Test for any SGML code point.
    Definition parser.hpp:264
    Test for any SGML code point from a given string of SGML code points.
    Definition parser.hpp:787
    Test for specific SGML code point.
    Definition parser.hpp:352
    -
    Test for valid DNS domain SGML character.
    Definition parser.hpp:2845
    -
    Test for valid IPv6 address scope ID SGML character.
    Definition parser.hpp:2535
    +
    Test for valid DNS domain SGML character.
    Definition parser.hpp:2846
    +
    Test for valid IPv6 address scope ID SGML character.
    Definition parser.hpp:2536
    Test for any SGML punctuation code point.
    Definition parser.hpp:517
    Test for any SGML space code point.
    Definition parser.hpp:439
    Test for any SGML space or punctuation code point.
    Definition parser.hpp:594
    Test for SGML given string.
    Definition parser.hpp:877
    -
    Test for valid URL password SGML character.
    Definition parser.hpp:3127
    -
    Test for valid URL path SGML character.
    Definition parser.hpp:3233
    -
    Test for valid URL username SGML character.
    Definition parser.hpp:3025
    +
    Test for valid URL password SGML character.
    Definition parser.hpp:3128
    +
    Test for valid URL path SGML character.
    Definition parser.hpp:3234
    +
    Test for valid URL username SGML character.
    Definition parser.hpp:3026
    Numerical interval.
    Definition interval.hpp:18
    T size() const
    Returns interval size.
    Definition interval.hpp:47
    T end
    interval end
    Definition interval.hpp:20
    interval() noexcept
    Constructs an invalid interval.
    Definition interval.hpp:25
    void invalidate()
    Invalidates interval.
    Definition interval.hpp:59
    T start
    interval start
    Definition interval.hpp:19
    -
    Tag attribute.
    Definition parser.hpp:8038
    -
    stdex::interval< size_t > name
    attribute name position in source
    Definition parser.hpp:8039
    -
    stdex::interval< size_t > value
    attribute value position in source
    Definition parser.hpp:8040
    -
    Definition parser.hpp:7197
    +
    Tag attribute.
    Definition parser.hpp:8039
    +
    stdex::interval< size_t > name
    attribute name position in source
    Definition parser.hpp:8040
    +
    stdex::interval< size_t > value
    attribute value position in source
    Definition parser.hpp:8041
    +
    Definition parser.hpp:7198
    diff --git a/pch_8hpp_source.html b/pch_8hpp_source.html index 71175ef2b..b30569df0 100644 --- a/pch_8hpp_source.html +++ b/pch_8hpp_source.html @@ -128,7 +128,7 @@ $(function() { codefold.init(0); });
    diff --git a/pool_8hpp_source.html b/pool_8hpp_source.html index f8f68ccbd..d098dc69c 100644 --- a/pool_8hpp_source.html +++ b/pool_8hpp_source.html @@ -162,17 +162,30 @@ $(function() { codefold.init(0); });
    88 ne.list.push_front(std::move(r));
    89 }
    -
    90 };
    +
    90
    +
    +
    94 void clear()
    +
    95 {
    +
    96 const std::lock_guard<std::mutex> guard_m(m_mutex);
    +
    97 for (auto& ne : m_available) {
    +
    98 const std::lock_guard<spinlock> guard_l(ne.second.lock);
    +
    99 while (!ne.second.list.empty())
    +
    100 ne.second.list.pop_front();
    +
    101 }
    +
    102 }
    -
    91}
    +
    103 };
    +
    +
    104}
    Per-NUMA pool of items.
    Definition pool.hpp:22
    +
    void clear()
    Removes all items from the pool.
    Definition pool.hpp:94
    T pop(numaid_t numa=numa_node())
    Removes an item from the pool.
    Definition pool.hpp:66
    void push(T &&r, numaid_t numa=numa_node())
    Adds an item to the pool.
    Definition pool.hpp:84
    Spin-lock.
    Definition spinlock.hpp:22
    diff --git a/progress_8hpp_source.html b/progress_8hpp_source.html index 696c1e501..14ac728f7 100644 --- a/progress_8hpp_source.html +++ b/progress_8hpp_source.html @@ -93,247 +93,385 @@ $(function() { codefold.init(0); });
    7
    8#include "compat.hpp"
    9#include "interval.hpp"
    -
    10#include <chrono>
    -
    11
    -
    12namespace stdex
    -
    13{
    -
    17 template <class T>
    -
    - -
    19 {
    -
    20 public:
    -
    -
    26 virtual void set_text(_In_z_ const char* msg)
    -
    27 {
    -
    28 _Unreferenced_(msg);
    -
    29 }
    +
    10#include <atomic>
    +
    11#include <chrono>
    +
    12#include <shared_mutex>
    +
    13#include <vector>
    +
    14
    +
    15namespace stdex
    +
    16{
    +
    20 template <class T>
    +
    + +
    22 {
    +
    23 public:
    +
    +
    29 virtual void set_text(_In_z_ const char* msg)
    +
    30 {
    +
    31 _Unreferenced_(msg);
    +
    32 }
    -
    30
    -
    -
    37 virtual void set_range(_In_ T start, _In_ T end)
    -
    38 {
    -
    39 start; end;
    -
    40 }
    +
    33
    +
    +
    40 virtual void set_range(_In_ T start, _In_ T end)
    +
    41 {
    +
    42 start; end;
    +
    43 }
    -
    41
    -
    -
    47 virtual void set(_In_ T value)
    -
    48 {
    -
    49 value;
    -
    50 }
    +
    44
    +
    +
    50 virtual void set(_In_ T value)
    +
    51 {
    +
    52 value;
    +
    53 }
    -
    51
    -
    -
    57 virtual void show(_In_ bool show = true)
    -
    58 {
    -
    59 _Unreferenced_(show);
    -
    60 }
    +
    54
    +
    +
    60 virtual void show(_In_ bool show = true)
    +
    61 {
    +
    62 _Unreferenced_(show);
    +
    63 }
    -
    61
    -
    -
    65 virtual bool cancel()
    -
    66 {
    -
    67 return false;
    -
    68 }
    +
    64
    +
    +
    68 virtual bool cancel()
    +
    69 {
    +
    70 return false;
    +
    71 }
    -
    69 };
    +
    72 };
    -
    70
    -
    76 template <class T>
    -
    -
    77 class lazy_progress : public progress<T>
    -
    78 {
    -
    79 public:
    -
    -
    85 lazy_progress(_In_ const std::chrono::nanoseconds& timeout = std::chrono::nanoseconds(500000)) :
    -
    86 m_timeout(timeout),
    -
    87 m_start(0),
    -
    88 m_end(0),
    -
    89 m_value(-1)
    -
    90 {}
    +
    73
    +
    79 template <class T>
    +
    +
    80 class lazy_progress : public progress<T>
    +
    81 {
    +
    82 public:
    +
    +
    88 lazy_progress(_In_ const std::chrono::nanoseconds& timeout = std::chrono::nanoseconds(500000)) :
    +
    89 m_timeout(timeout),
    +
    90 m_start(0),
    +
    91 m_end(0),
    +
    92 m_value(-1)
    +
    93 {}
    -
    91
    -
    -
    98 virtual void set_range(_In_ T start, _In_ T end)
    -
    99 {
    -
    100 m_start = start;
    -
    101 m_end = end;
    -
    102 }
    +
    94
    +
    +
    101 virtual void set_range(_In_ T start, _In_ T end)
    +
    102 {
    +
    103 m_start = start;
    +
    104 m_end = end;
    +
    105 }
    -
    103
    -
    -
    109 virtual void set(_In_ T value)
    -
    110 {
    -
    111 if (value == m_start || value == m_end)
    -
    112 m_last = std::chrono::high_resolution_clock::now();
    -
    113 else if (value == m_value)
    -
    114 return;
    -
    115 else {
    -
    116 auto now = std::chrono::high_resolution_clock::now();
    -
    117 if (now - m_last < m_timeout)
    -
    118 return;
    -
    119 m_last = now;
    -
    120 }
    -
    121 m_value = value;
    -
    122 do_set();
    -
    123 }
    +
    106
    +
    +
    112 virtual void set(_In_ T value)
    +
    113 {
    +
    114 if (value == m_start || value == m_end)
    +
    115 m_last = std::chrono::high_resolution_clock::now();
    +
    116 else if (value == m_value)
    +
    117 return;
    +
    118 else {
    +
    119 auto now = std::chrono::high_resolution_clock::now();
    +
    120 if (now - m_last < m_timeout)
    +
    121 return;
    +
    122 m_last = now;
    +
    123 }
    +
    124 m_value = value;
    +
    125 do_set();
    +
    126 }
    -
    124
    -
    125 protected:
    -
    129 virtual void do_set() {}
    -
    130
    -
    131 protected:
    -
    132 std::chrono::nanoseconds m_timeout;
    -
    133 std::chrono::system_clock::time_point m_last;
    -
    134 T m_start, m_end, m_value;
    -
    135 };
    +
    127
    +
    128 protected:
    +
    132 virtual void do_set() {}
    +
    133
    +
    134 protected:
    +
    135 std::chrono::nanoseconds m_timeout;
    +
    136 std::chrono::system_clock::time_point m_last;
    +
    137 T m_start, m_end, m_value;
    +
    138 };
    -
    136
    -
    142 template <class T>
    -
    -
    143 class global_progress : public progress<T>
    -
    144 {
    -
    145 public:
    -
    -
    151 global_progress(_In_opt_ progress<T>* host = NULL) : m_host(host)
    -
    152 {}
    +
    139
    +
    145 template <class T>
    +
    +
    146 class global_progress : public progress<T>
    +
    147 {
    +
    148 public:
    +
    +
    154 global_progress(_In_opt_ progress<T>* host = nullptr) : m_host(host)
    +
    155 {}
    -
    153
    -
    -
    159 void attach(_In_opt_ progress<T>* host)
    -
    160 {
    -
    161 m_host = host;
    -
    162 }
    +
    156
    +
    +
    162 void attach(_In_opt_ progress<T>* host)
    +
    163 {
    +
    164 m_host = host;
    +
    165 }
    -
    163
    -
    - -
    170 {
    -
    171 progress<T>* k = m_host;
    -
    172 m_host = NULL;
    -
    173 return k;
    -
    174 }
    +
    166
    +
    + +
    173 {
    +
    174 progress<T>* k = m_host;
    +
    175 m_host = nullptr;
    +
    176 return k;
    +
    177 }
    -
    175
    -
    -
    182 void set_global_range(_In_ T start, _In_ T end)
    -
    183 {
    -
    184 m_global.start = start;
    -
    185 m_global.end = end;
    -
    186 if (m_host)
    -
    187 m_host->set_range(m_global.start, m_global.end);
    -
    188 }
    +
    178
    +
    +
    185 void set_global_range(_In_ T start, _In_ T end)
    +
    186 {
    +
    187 m_global.start = start;
    +
    188 m_global.end = end;
    +
    189 if (m_host)
    +
    190 m_host->set_range(m_global.start, m_global.end);
    +
    191 }
    -
    189
    -
    -
    196 void set_section_range(_In_ T start, _In_ T end)
    -
    197 {
    -
    198 m_section.start = start;
    -
    199 m_section.end = end;
    -
    200 }
    +
    192
    +
    +
    199 void set_section_range(_In_ T start, _In_ T end)
    +
    200 {
    +
    201 m_section.start = start;
    +
    202 m_section.end = end;
    +
    203 }
    -
    201
    -
    -
    207 virtual void set_text(_In_ const char* msg)
    -
    208 {
    -
    209 if (m_host)
    -
    210 m_host->set_text(msg);
    -
    211 }
    +
    204
    +
    +
    210 virtual void set_text(_In_ const char* msg)
    +
    211 {
    +
    212 if (m_host)
    +
    213 m_host->set_text(msg);
    +
    214 }
    -
    212
    -
    -
    219 virtual void set_range(_In_ T start, _In_ T end)
    -
    220 {
    -
    221 m_local.start = start;
    -
    222 m_local.end = end;
    -
    223 }
    +
    215
    +
    +
    222 virtual void set_range(_In_ T start, _In_ T end)
    +
    223 {
    +
    224 m_local.start = start;
    +
    225 m_local.end = end;
    +
    226 }
    -
    224
    -
    -
    230 virtual void set(_In_ T value)
    -
    231 {
    -
    232 if (m_host) {
    -
    233 T size = m_local.size();
    -
    234 if (size != 0) {
    -
    235 // TODO: Implement with muldiv.
    -
    236 m_host->set(((value - m_local.start) * m_section.size() / size) + m_section.start);
    -
    237 }
    -
    238 }
    -
    239 }
    +
    227
    +
    +
    233 virtual void set(_In_ T value)
    +
    234 {
    +
    235 if (m_host) {
    +
    236 T size = m_local.size();
    +
    237 if (size != 0) {
    +
    238 // TODO: Implement with muldiv.
    +
    239 m_host->set(((value - m_local.start) * m_section.size() / size) + m_section.start);
    +
    240 }
    +
    241 }
    +
    242 }
    -
    240
    -
    -
    246 virtual void show(_In_ bool show = true)
    -
    247 {
    -
    248 if (m_host)
    -
    249 m_host->show(show);
    -
    250 }
    +
    243
    +
    +
    249 virtual void show(_In_ bool show = true)
    +
    250 {
    +
    251 if (m_host)
    +
    252 m_host->show(show);
    +
    253 }
    -
    251
    -
    -
    255 virtual bool cancel()
    -
    256 {
    -
    257 return m_host && m_host->cancel();
    -
    258 }
    +
    254
    +
    +
    258 virtual bool cancel()
    +
    259 {
    +
    260 return m_host && m_host->cancel();
    +
    261 }
    -
    259
    -
    260 protected:
    -
    261 progress<T>* m_host;
    -
    262 interval<T> m_local, m_global, m_section;
    -
    263 };
    +
    262
    +
    263 protected:
    +
    264 progress<T>* m_host;
    +
    265 interval<T> m_local, m_global, m_section;
    +
    266 };
    -
    264
    -
    270
    -
    271 template <class T>
    -
    - -
    273 {
    -
    274 public:
    - -
    276 global_progress<T>(host),
    -
    277 m_host_ref(host)
    -
    278 {
    -
    279 m_host_ref = this;
    -
    280 }
    -
    281
    - -
    283 {
    -
    284 m_host_ref = this->detach();
    -
    285 }
    -
    286
    -
    287 protected:
    -
    288 progress<T>*& m_host_ref;
    -
    289 };
    +
    267
    +
    273 template <class T>
    +
    + +
    275 {
    +
    276 public:
    + +
    278 global_progress<T>(host),
    +
    279 m_host_ref(host)
    +
    280 {
    +
    281 m_host_ref = this;
    +
    282 }
    +
    283
    + +
    285 {
    +
    286 m_host_ref = this->detach();
    +
    287 }
    +
    288
    +
    289 protected:
    +
    290 progress<T>*& m_host_ref;
    +
    291 };
    -
    290}
    -
    Global progress indicator base class.
    Definition progress.hpp:144
    -
    global_progress(progress< T > *host=NULL)
    Constructs a progress indicator.
    Definition progress.hpp:151
    -
    void set_section_range(T start, T end)
    Set section extend of the progress indicator.
    Definition progress.hpp:196
    -
    virtual void show(bool show=true)
    Show or hide progress.
    Definition progress.hpp:246
    -
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:255
    -
    virtual void set(T value)
    Set local current progress.
    Definition progress.hpp:230
    -
    virtual void set_text(const char *msg)
    Set progress indicator text.
    Definition progress.hpp:207
    -
    progress< T > * detach()
    Detach host progress indicator.
    Definition progress.hpp:169
    -
    void set_global_range(T start, T end)
    Set global extend of the progress indicator.
    Definition progress.hpp:182
    -
    void attach(progress< T > *host)
    Attach to a host progress indicator.
    Definition progress.hpp:159
    -
    virtual void set_range(T start, T end)
    Set local extend of the progress indicator.
    Definition progress.hpp:219
    -
    Lazy progress indicator base class.
    Definition progress.hpp:78
    -
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:109
    -
    lazy_progress(const std::chrono::nanoseconds &timeout=std::chrono::nanoseconds(500000))
    Constructs a lazy progress indicator.
    Definition progress.hpp:85
    -
    virtual void do_set()
    Called when progress reporting is due. Should override this method to implement actual progress refre...
    Definition progress.hpp:129
    -
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:98
    -
    Progress indicator switcher.
    Definition progress.hpp:273
    -
    Progress indicator base class.
    Definition progress.hpp:19
    -
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:65
    -
    virtual void set_text(const char *msg)
    Set progress indicator text.
    Definition progress.hpp:26
    -
    virtual void show(bool show=true)
    Show or hide progress.
    Definition progress.hpp:57
    -
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:47
    -
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:37
    +
    292
    +
    298 template <class T>
    +
    + +
    300 {
    +
    301 protected:
    +
    +
    305 class worker_progress : public progress<T>
    +
    306 {
    +
    307 protected:
    +
    308 aggregate_progress<T>& m_host;
    +
    309 T m_start, m_end, m_value;
    +
    310
    +
    311 public:
    + +
    313 m_host(host),
    +
    314 m_start(0), m_end(0),
    +
    315 m_value(0)
    +
    316 {}
    +
    317
    +
    +
    323 virtual void set_text(_In_ const char* msg)
    +
    324 {
    +
    325 std::shared_lock<std::shared_mutex> lk(m_host.m_mutex);
    +
    326 if (m_host.m_host)
    +
    327 m_host.m_host->set_text(msg);
    +
    328 }
    +
    +
    329
    +
    +
    336 virtual void set_range(_In_ T start, _In_ T end)
    +
    337 {
    +
    338 T
    +
    339 combined_start = m_host.m_start += start - m_start,
    +
    340 combined_end = m_host.m_end += end - m_end;
    +
    341 m_start = start;
    +
    342 m_end = end;
    +
    343 std::shared_lock<std::shared_mutex> lk(m_host.m_mutex);
    +
    344 if (m_host.m_host)
    +
    345 m_host.m_host->set_range(combined_start, combined_end);
    +
    346 }
    +
    +
    347
    +
    +
    353 virtual void set(_In_ T value)
    +
    354 {
    +
    355 T combined_value = m_host.m_value += value - m_value;
    +
    356 m_value = value;
    +
    357 std::shared_lock<std::shared_mutex> lk(m_host.m_mutex);
    +
    358 if (m_host.m_host)
    +
    359 m_host.m_host->set(combined_value);
    +
    360 }
    +
    +
    361
    +
    +
    367 virtual void show(_In_ bool show = true)
    +
    368 {
    +
    369 std::shared_lock<std::shared_mutex> lk(m_host.m_mutex);
    +
    370 if (m_host.m_host)
    +
    371 m_host.m_host->show(show);
    +
    372 }
    +
    +
    373
    +
    +
    377 virtual bool cancel()
    +
    378 {
    +
    379 std::shared_lock<std::shared_mutex> lk(m_host.m_mutex);
    +
    380 return m_host.m_host && m_host.m_host->cancel();
    +
    381 }
    +
    +
    382 };
    +
    +
    383
    +
    384 progress<T>* m_host;
    +
    385 std::atomic<T> m_start, m_end, m_value;
    +
    386 std::vector<worker_progress> m_workers;
    +
    387 std::shared_mutex m_mutex;
    +
    388
    +
    389 public:
    +
    +
    396 aggregate_progress(_In_ size_t num_workers, _In_opt_ progress<T>* host = nullptr) :
    +
    397 m_host(host),
    +
    398 m_start(0), m_end(0),
    +
    399 m_value(0)
    +
    400 {
    +
    401 m_workers.reserve(num_workers);
    +
    402 for (size_t i = 0; i < num_workers; ++i)
    +
    403 m_workers.push_back(std::move(worker_progress(*this)));
    +
    404 if (m_host) {
    +
    405 m_host->set_range(m_start, m_end);
    +
    406 m_host->set(m_value);
    +
    407 }
    +
    408 }
    +
    +
    409
    +
    +
    415 void attach(_In_opt_ progress<T>* host)
    +
    416 {
    +
    417 std::unique_lock<std::shared_mutex> lk(m_mutex);
    +
    418 m_host = host;
    +
    419 if (m_host) {
    +
    420 m_host->set_range(m_start, m_end);
    +
    421 m_host->set(m_value);
    +
    422 }
    +
    423 }
    +
    +
    424
    +
    + +
    431 {
    +
    432 std::unique_lock<std::shared_mutex> lk(m_mutex);
    +
    433 progress<T>* k = m_host;
    +
    434 m_host = nullptr;
    +
    435 return k;
    +
    436 }
    +
    +
    437
    +
    +
    445 progress<T>& operator[](_In_ size_t index)
    +
    446 {
    +
    447 return m_workers[index];
    +
    448 }
    +
    +
    449 };
    +
    +
    450}
    +
    Progress indicator for individual worker.
    Definition progress.hpp:306
    +
    virtual void set(T value)
    Set local current progress.
    Definition progress.hpp:353
    +
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:377
    +
    virtual void show(bool show=true)
    Show or hide progress.
    Definition progress.hpp:367
    +
    virtual void set_range(T start, T end)
    Set local extend of the progress indicator.
    Definition progress.hpp:336
    +
    virtual void set_text(const char *msg)
    Set progress indicator text.
    Definition progress.hpp:323
    +
    Aggregated progress indicator.
    Definition progress.hpp:300
    +
    progress< T > & operator[](size_t index)
    Returns progress indicator for specific worker.
    Definition progress.hpp:445
    +
    void attach(progress< T > *host)
    Attach to a host progress indicator.
    Definition progress.hpp:415
    +
    progress< T > * detach()
    Detach host progress indicator.
    Definition progress.hpp:430
    +
    aggregate_progress(size_t num_workers, progress< T > *host=nullptr)
    Constructs a progress indicator.
    Definition progress.hpp:396
    +
    Global progress indicator.
    Definition progress.hpp:147
    +
    void set_section_range(T start, T end)
    Set section extend of the progress indicator.
    Definition progress.hpp:199
    +
    virtual void show(bool show=true)
    Show or hide progress.
    Definition progress.hpp:249
    +
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:258
    +
    virtual void set(T value)
    Set local current progress.
    Definition progress.hpp:233
    +
    virtual void set_text(const char *msg)
    Set progress indicator text.
    Definition progress.hpp:210
    +
    progress< T > * detach()
    Detach host progress indicator.
    Definition progress.hpp:172
    +
    void set_global_range(T start, T end)
    Set global extend of the progress indicator.
    Definition progress.hpp:185
    +
    global_progress(progress< T > *host=nullptr)
    Constructs a progress indicator.
    Definition progress.hpp:154
    +
    void attach(progress< T > *host)
    Attach to a host progress indicator.
    Definition progress.hpp:162
    +
    virtual void set_range(T start, T end)
    Set local extend of the progress indicator.
    Definition progress.hpp:222
    +
    Lazy progress indicator.
    Definition progress.hpp:81
    +
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:112
    +
    lazy_progress(const std::chrono::nanoseconds &timeout=std::chrono::nanoseconds(500000))
    Constructs a lazy progress indicator.
    Definition progress.hpp:88
    +
    virtual void do_set()
    Called when progress reporting is due. Should override this method to implement actual progress refre...
    Definition progress.hpp:132
    +
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:101
    +
    Progress indicator switcher.
    Definition progress.hpp:275
    +
    Progress indicator base class.
    Definition progress.hpp:22
    +
    virtual bool cancel()
    Query whether user requested abort.
    Definition progress.hpp:68
    +
    virtual void set_text(const char *msg)
    Set progress indicator text.
    Definition progress.hpp:29
    +
    virtual void show(bool show=true)
    Show or hide progress.
    Definition progress.hpp:60
    +
    virtual void set(T value)
    Set current progress.
    Definition progress.hpp:50
    +
    virtual void set_range(T start, T end)
    Set progress range extent.
    Definition progress.hpp:40
    Numerical interval.
    Definition interval.hpp:18
    diff --git a/ring_8cpp_source.html b/ring_8cpp_source.html index e627ea271..d5c96e7a5 100644 --- a/ring_8cpp_source.html +++ b/ring_8cpp_source.html @@ -146,7 +146,7 @@ $(function() { codefold.init(0); });
    diff --git a/ring_8hpp_source.html b/ring_8hpp_source.html index e5a612fa3..df754ef0d 100644 --- a/ring_8hpp_source.html +++ b/ring_8hpp_source.html @@ -225,7 +225,7 @@ $(function() { codefold.init(0); });
    diff --git a/search/all_0.js b/search/all_0.js index 9f12ee237..12e9fef6b 100644 --- a/search/all_0.js +++ b/search/all_0.js @@ -5,20 +5,21 @@ var searchData= ['active_5ftokens_2',['active_tokens',['../structstdex_1_1html_1_1inserted__token.html#ab1c682b7bd0b4d6b0d0d316af20a4fc9',1,'stdex::html::inserted_token']]], ['admin_3',['admin',['../structstdex_1_1sys__info__t.html#a31d755b61ee96cc3f1174a7c6cbd509c',1,'stdex::sys_info_t']]], ['after_5fword_4',['after_word',['../structstdex_1_1html_1_1inserted__token.html#a741265f0cf369113853daae0f01cf775',1,'stdex::html::inserted_token']]], - ['allow_5fon_5fedge_5',['allow_on_edge',['../classstdex_1_1parser_1_1basic__dns__domain__char.html#a3307235d495a97c98f9efd1464e8a8a7',1,'stdex::parser::basic_dns_domain_char']]], - ['aosn_5fdate_6',['aosn_date',['../structstdex_1_1chrono_1_1aosn__date.html',1,'stdex::chrono']]], - ['aosn_5ftimestamp_7',['aosn_timestamp',['../structstdex_1_1chrono_1_1aosn__timestamp.html',1,'stdex::chrono']]], - ['apex_8',['apex',['../classstdex_1_1parser_1_1basic__emoticon.html#a1b6b7a024dea373b890c1c4516f5e9a4',1,'stdex::parser::basic_emoticon']]], - ['append_9',['append',['../classstdex_1_1html_1_1document.html#a273b8b833d039824d048517d80295f94',1,'stdex::html::document']]], - ['append_5finserted_5ftokens_10',['append_inserted_tokens',['../classstdex_1_1html_1_1parser.html#a00f6f82ed5807d87f1b16af89f03226a',1,'stdex::html::parser']]], - ['append_5ftag_11',['append_tag',['../classstdex_1_1html_1_1token.html#af5ccf4221ba4739d91daffced7683e9e',1,'stdex::html::token::append_tag(std::basic_string< char, TR, AX > &str) const'],['../classstdex_1_1html_1_1token.html#abd4f24cfd401b7f48f7ac2fd6c4bd5ff',1,'stdex::html::token::append_tag(std::basic_string< wchar_t, TR, AX > &str) const']]], - ['append_5ftoken_12',['append_token',['../classstdex_1_1html_1_1parser.html#a8a28b266d7a373183f11912d180423d2',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token)'],['../classstdex_1_1html_1_1parser.html#acddefe7c4a28d9ddfb128e160dcaa3c4',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token, std::basic_string< T, TR, AX > &source)']]], - ['assign_13',['assign',['../classstdex_1_1html_1_1document.html#ae2fe171fbcaa696fd3eecd633491f4af',1,'stdex::html::document']]], - ['async_5freader_14',['async_reader',['../classstdex_1_1stream_1_1async__reader.html',1,'stdex::stream']]], - ['async_5fwriter_15',['async_writer',['../classstdex_1_1stream_1_1async__writer.html',1,'stdex::stream']]], - ['at_16',['at',['../classstdex_1_1vector__queue.html#ae135f77af0deabaa5f2cfe5ca25b9f09',1,'stdex::vector_queue::at(size_type pos)'],['../classstdex_1_1vector__queue.html#ac2b559184798a59ee5fed26f27d92e3c',1,'stdex::vector_queue::at(size_type pos) const']]], - ['at_5fabs_17',['at_abs',['../classstdex_1_1vector__queue.html#a881da485c13dcee1d35245570420877a',1,'stdex::vector_queue::at_abs(size_type pos)'],['../classstdex_1_1vector__queue.html#afee762c3280d33544ce8dd8ad20af40b',1,'stdex::vector_queue::at_abs(size_type pos) const']]], - ['atime_18',['atime',['../classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826',1,'stdex::stream::basic_file::atime()'],['../classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7',1,'stdex::stream::cache::atime()'],['../classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3',1,'stdex::stream::file::atime()']]], - ['attach_19',['attach',['../classstdex_1_1global__progress.html#aec91532fde2500a5458a397f91c88769',1,'stdex::global_progress']]], - ['attributes_20',['attributes',['../classstdex_1_1html_1_1element.html#a7c087846ffc38135f3ff7665aec32364',1,'stdex::html::element::attributes'],['../classstdex_1_1html_1_1declaration.html#a46a0e7db45a103885963629b5b7cba04',1,'stdex::html::declaration::attributes'],['../classstdex_1_1parser_1_1basic__html__tag.html#a02dfb47e560d0b0243b73d09851c4412',1,'stdex::parser::basic_html_tag::attributes']]] + ['aggregate_5fprogress_5',['aggregate_progress',['../classstdex_1_1aggregate__progress.html',1,'stdex::aggregate_progress< T >'],['../classstdex_1_1aggregate__progress.html#ae832067bbc39765c8e53c2f6434f885a',1,'stdex::aggregate_progress::aggregate_progress()']]], + ['allow_5fon_5fedge_6',['allow_on_edge',['../classstdex_1_1parser_1_1basic__dns__domain__char.html#a3307235d495a97c98f9efd1464e8a8a7',1,'stdex::parser::basic_dns_domain_char']]], + ['aosn_5fdate_7',['aosn_date',['../structstdex_1_1chrono_1_1aosn__date.html',1,'stdex::chrono']]], + ['aosn_5ftimestamp_8',['aosn_timestamp',['../structstdex_1_1chrono_1_1aosn__timestamp.html',1,'stdex::chrono']]], + ['apex_9',['apex',['../classstdex_1_1parser_1_1basic__emoticon.html#a1b6b7a024dea373b890c1c4516f5e9a4',1,'stdex::parser::basic_emoticon']]], + ['append_10',['append',['../classstdex_1_1html_1_1document.html#a273b8b833d039824d048517d80295f94',1,'stdex::html::document']]], + ['append_5finserted_5ftokens_11',['append_inserted_tokens',['../classstdex_1_1html_1_1parser.html#a00f6f82ed5807d87f1b16af89f03226a',1,'stdex::html::parser']]], + ['append_5ftag_12',['append_tag',['../classstdex_1_1html_1_1token.html#af5ccf4221ba4739d91daffced7683e9e',1,'stdex::html::token::append_tag(std::basic_string< char, TR, AX > &str) const'],['../classstdex_1_1html_1_1token.html#abd4f24cfd401b7f48f7ac2fd6c4bd5ff',1,'stdex::html::token::append_tag(std::basic_string< wchar_t, TR, AX > &str) const']]], + ['append_5ftoken_13',['append_token',['../classstdex_1_1html_1_1parser.html#a8a28b266d7a373183f11912d180423d2',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token)'],['../classstdex_1_1html_1_1parser.html#acddefe7c4a28d9ddfb128e160dcaa3c4',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token, std::basic_string< T, TR, AX > &source)']]], + ['assign_14',['assign',['../classstdex_1_1html_1_1document.html#ae2fe171fbcaa696fd3eecd633491f4af',1,'stdex::html::document']]], + ['async_5freader_15',['async_reader',['../classstdex_1_1stream_1_1async__reader.html',1,'stdex::stream']]], + ['async_5fwriter_16',['async_writer',['../classstdex_1_1stream_1_1async__writer.html',1,'stdex::stream']]], + ['at_17',['at',['../classstdex_1_1vector__queue.html#ae135f77af0deabaa5f2cfe5ca25b9f09',1,'stdex::vector_queue::at(size_type pos)'],['../classstdex_1_1vector__queue.html#ac2b559184798a59ee5fed26f27d92e3c',1,'stdex::vector_queue::at(size_type pos) const']]], + ['at_5fabs_18',['at_abs',['../classstdex_1_1vector__queue.html#a881da485c13dcee1d35245570420877a',1,'stdex::vector_queue::at_abs(size_type pos)'],['../classstdex_1_1vector__queue.html#afee762c3280d33544ce8dd8ad20af40b',1,'stdex::vector_queue::at_abs(size_type pos) const']]], + ['atime_19',['atime',['../classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826',1,'stdex::stream::basic_file::atime()'],['../classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7',1,'stdex::stream::cache::atime()'],['../classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3',1,'stdex::stream::file::atime()']]], + ['attach_20',['attach',['../classstdex_1_1global__progress.html#aec91532fde2500a5458a397f91c88769',1,'stdex::global_progress::attach()'],['../classstdex_1_1aggregate__progress.html#a4f41de4cbad813446edd060bea1e92f2',1,'stdex::aggregate_progress::attach()']]], + ['attributes_21',['attributes',['../classstdex_1_1html_1_1element.html#a7c087846ffc38135f3ff7665aec32364',1,'stdex::html::element::attributes'],['../classstdex_1_1html_1_1declaration.html#a46a0e7db45a103885963629b5b7cba04',1,'stdex::html::declaration::attributes'],['../classstdex_1_1parser_1_1basic__html__tag.html#a02dfb47e560d0b0243b73d09851c4412',1,'stdex::parser::basic_html_tag::attributes']]] ]; diff --git a/search/all_1.js b/search/all_1.js index 46a2066ce..0cff04969 100644 --- a/search/all_1.js +++ b/search/all_1.js @@ -87,16 +87,17 @@ var searchData= ['basic_5furl_5fusername_5fchar_84',['basic_url_username_char',['../classstdex_1_1parser_1_1basic__url__username__char.html',1,'stdex::parser']]], ['basic_5furl_5fusername_5fchar_3c_20char_20_3e_85',['basic_url_username_char< char >',['../classstdex_1_1parser_1_1basic__url__username__char.html',1,'stdex::parser']]], ['bban_86',['bban',['../classstdex_1_1parser_1_1basic__iban.html#a527b724e495e34938d8e57179e5dbd71',1,'stdex::parser::basic_iban']]], - ['bits_5fper_5fchannel_87',['bits_per_channel',['../structstdex_1_1wav_1_1format.html#a67f8c858e962c30f4f38f08bfc02354f',1,'stdex::wav::format']]], - ['block_5falign_88',['block_align',['../structstdex_1_1wav_1_1format.html#ad1e8389dc2e46f4a89ca19bb5b9804f5',1,'stdex::wav::format']]], - ['block_5fhash_89',['block_hash',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['block_5fhash_3c_20md5_5ft_20_3e_90',['block_hash< md5_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['block_5fhash_3c_20sha1_5ft_20_3e_91',['block_hash< sha1_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['block_5foffset_92',['block_offset',['../structstdex_1_1wav_1_1cue.html#ad38b61b681205faa6af40310b305758e',1,'stdex::wav::cue']]], - ['block_5fstart_93',['block_start',['../structstdex_1_1wav_1_1cue.html#a5ff713152c9608e62a8ee0a97a01bdac',1,'stdex::wav::cue']]], - ['buf_94',['buf',['../classstdex_1_1hex__dec.html#a47a6b05d03e3cd075fe74505675b5126',1,'stdex::hex_dec']]], - ['buffer_95',['buffer',['../classstdex_1_1stream_1_1buffer.html',1,'stdex::stream']]], - ['buffer_5ft_96',['buffer_t',['../structstdex_1_1stream_1_1buffer_1_1buffer__t.html',1,'stdex::stream::buffer']]], - ['buffered_5fsys_97',['buffered_sys',['../classstdex_1_1stream_1_1buffered__sys.html',1,'stdex::stream']]], - ['bytes_5fper_5fsecond_98',['bytes_per_second',['../structstdex_1_1wav_1_1format.html#a09a6dc6744dbd0331c2dd50379679497',1,'stdex::wav::format']]] + ['benchmark_87',['benchmark',['../classstdex_1_1benchmark.html',1,'stdex::benchmark'],['../classstdex_1_1benchmark.html#a004f16b1c20325b8fbb578f250c406c4',1,'stdex::benchmark::benchmark()']]], + ['bits_5fper_5fchannel_88',['bits_per_channel',['../structstdex_1_1wav_1_1format.html#a67f8c858e962c30f4f38f08bfc02354f',1,'stdex::wav::format']]], + ['block_5falign_89',['block_align',['../structstdex_1_1wav_1_1format.html#ad1e8389dc2e46f4a89ca19bb5b9804f5',1,'stdex::wav::format']]], + ['block_5fhash_90',['block_hash',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['block_5fhash_3c_20md5_5ft_20_3e_91',['block_hash< md5_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['block_5fhash_3c_20sha1_5ft_20_3e_92',['block_hash< sha1_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['block_5foffset_93',['block_offset',['../structstdex_1_1wav_1_1cue.html#ad38b61b681205faa6af40310b305758e',1,'stdex::wav::cue']]], + ['block_5fstart_94',['block_start',['../structstdex_1_1wav_1_1cue.html#a5ff713152c9608e62a8ee0a97a01bdac',1,'stdex::wav::cue']]], + ['buf_95',['buf',['../classstdex_1_1hex__dec.html#a47a6b05d03e3cd075fe74505675b5126',1,'stdex::hex_dec']]], + ['buffer_96',['buffer',['../classstdex_1_1stream_1_1buffer.html',1,'stdex::stream']]], + ['buffer_5ft_97',['buffer_t',['../structstdex_1_1stream_1_1buffer_1_1buffer__t.html',1,'stdex::stream::buffer']]], + ['buffered_5fsys_98',['buffered_sys',['../classstdex_1_1stream_1_1buffered__sys.html',1,'stdex::stream']]], + ['bytes_5fper_5fsecond_99',['bytes_per_second',['../structstdex_1_1wav_1_1format.html#a09a6dc6744dbd0331c2dd50379679497',1,'stdex::wav::format']]] ]; diff --git a/search/all_10.js b/search/all_10.js index f922ac089..d526366de 100644 --- a/search/all_10.js +++ b/search/all_10.js @@ -9,14 +9,14 @@ var searchData= ['seekend_6',['seekend',['../classstdex_1_1stream_1_1basic__file.html#ae13b5941415b3dbb9883c1da9bcd39c7',1,'stdex::stream::basic_file']]], ['segments_7',['segments',['../classstdex_1_1parser_1_1http__url__path.html#a9a5f4002c55cb4500ce43536512b02b9',1,'stdex::parser::http_url_path']]], ['sequence_8',['sequence',['../classstdex_1_1html_1_1sequence.html',1,'stdex::html::sequence'],['../classstdex_1_1html_1_1token.html#a20890ed953b05911dd66fc23a81fd362',1,'stdex::html::token::sequence']]], - ['set_9',['set',['../classstdex_1_1progress.html#acf3a29daf22709bf7e94e864c8be95a1',1,'stdex::progress::set()'],['../classstdex_1_1lazy__progress.html#a4e3e7a80da8cce7ccec69c78fcaaabae',1,'stdex::lazy_progress::set()'],['../classstdex_1_1global__progress.html#a76e66104444c77b89b687b4ad4945e8e',1,'stdex::global_progress::set()'],['../classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571',1,'stdex::stream::memory_file::set()']]], + ['set_9',['set',['../classstdex_1_1progress.html#acf3a29daf22709bf7e94e864c8be95a1',1,'stdex::progress::set()'],['../classstdex_1_1lazy__progress.html#a4e3e7a80da8cce7ccec69c78fcaaabae',1,'stdex::lazy_progress::set()'],['../classstdex_1_1global__progress.html#a76e66104444c77b89b687b4ad4945e8e',1,'stdex::global_progress::set()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#a61a1f4accad5a1243e1bbf4084205bef',1,'stdex::aggregate_progress::worker_progress::set()'],['../classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571',1,'stdex::stream::memory_file::set()']]], ['set_5fatime_10',['set_atime',['../classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0',1,'stdex::stream::basic_file::set_atime()'],['../classstdex_1_1stream_1_1cache.html#af026881969ee78e2aef1bf02922aea93',1,'stdex::stream::cache::set_atime()'],['../classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6',1,'stdex::stream::file::set_atime()']]], ['set_5fctime_11',['set_ctime',['../classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56',1,'stdex::stream::basic_file::set_ctime()'],['../classstdex_1_1stream_1_1cache.html#ae62a75156ff79910e1b9afc506e38e44',1,'stdex::stream::cache::set_ctime()'],['../classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23',1,'stdex::stream::file::set_ctime()']]], ['set_5fglobal_5frange_12',['set_global_range',['../classstdex_1_1global__progress.html#ac68b491c62861fae1b16abb3477cb9c1',1,'stdex::global_progress']]], ['set_5fmtime_13',['set_mtime',['../classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b',1,'stdex::stream::basic_file::set_mtime()'],['../classstdex_1_1stream_1_1cache.html#aafad7bfb4c03d0d56854b4c148ae0ee1',1,'stdex::stream::cache::set_mtime()'],['../classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762',1,'stdex::stream::file::set_mtime()']]], - ['set_5frange_14',['set_range',['../classstdex_1_1progress.html#afbb1513bdb20340ebb21bd988f4e424a',1,'stdex::progress::set_range()'],['../classstdex_1_1lazy__progress.html#ada3a0d4f0086823558115a8064ffffb6',1,'stdex::lazy_progress::set_range()'],['../classstdex_1_1global__progress.html#afb204b820637c19b494976af4a284704',1,'stdex::global_progress::set_range(T start, T end)']]], + ['set_5frange_14',['set_range',['../classstdex_1_1progress.html#afbb1513bdb20340ebb21bd988f4e424a',1,'stdex::progress::set_range()'],['../classstdex_1_1lazy__progress.html#ada3a0d4f0086823558115a8064ffffb6',1,'stdex::lazy_progress::set_range()'],['../classstdex_1_1global__progress.html#afb204b820637c19b494976af4a284704',1,'stdex::global_progress::set_range()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#ab11e34d7b3bb61db20f98379813f3ad6',1,'stdex::aggregate_progress::worker_progress::set_range()']]], ['set_5fsection_5frange_15',['set_section_range',['../classstdex_1_1global__progress.html#a242009bce7ac595975bbfd703ec58c3b',1,'stdex::global_progress']]], - ['set_5ftext_16',['set_text',['../classstdex_1_1progress.html#a2cab8b5ac137d16fced31ee205264b01',1,'stdex::progress::set_text()'],['../classstdex_1_1global__progress.html#a89b7116003ab3b6344d90f130c14933e',1,'stdex::global_progress::set_text()']]], + ['set_5ftext_16',['set_text',['../classstdex_1_1progress.html#a2cab8b5ac137d16fced31ee205264b01',1,'stdex::progress::set_text()'],['../classstdex_1_1global__progress.html#a89b7116003ab3b6344d90f130c14933e',1,'stdex::global_progress::set_text()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#ae84e8b08865cf05024e8a777d9a75711',1,'stdex::aggregate_progress::worker_progress::set_text()']]], ['sgml_5fany_5fcp_17',['sgml_any_cp',['../classstdex_1_1parser_1_1sgml__any__cp.html',1,'stdex::parser']]], ['sgml_5fcp_18',['sgml_cp',['../classstdex_1_1parser_1_1sgml__cp.html',1,'stdex::parser']]], ['sgml_5fcp_5fset_19',['sgml_cp_set',['../classstdex_1_1parser_1_1sgml__cp__set.html',1,'stdex::parser']]], @@ -32,7 +32,7 @@ var searchData= ['sha1_5fhash_29',['sha1_hash',['../classstdex_1_1sha1__hash.html',1,'stdex']]], ['sha256_5ft_30',['sha256_t',['../unionstdex_1_1sha256__t.html',1,'stdex']]], ['sha_5ft_31',['sha_t',['../unionstdex_1_1sha__t.html',1,'stdex']]], - ['show_32',['show',['../classstdex_1_1progress.html#ab6e57aed9e7a18a501e8a63cef199d8e',1,'stdex::progress::show()'],['../classstdex_1_1global__progress.html#a32350e02d5904867402187e81a3c4a26',1,'stdex::global_progress::show()']]], + ['show_32',['show',['../classstdex_1_1progress.html#ab6e57aed9e7a18a501e8a63cef199d8e',1,'stdex::progress::show()'],['../classstdex_1_1global__progress.html#a32350e02d5904867402187e81a3c4a26',1,'stdex::global_progress::show()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#aa48fb208c1bf38d041669e4b1d0b8a46',1,'stdex::aggregate_progress::worker_progress::show()']]], ['silence_33',['silence',['../structstdex_1_1wav_1_1silence.html',1,'stdex::wav']]], ['size_34',['size',['../classstdex_1_1basic__hash.html#a9b8b5f91873e5d2cfe93533832318b5a',1,'stdex::basic_hash::size()'],['../structstdex_1_1interval.html#a8c5222bc73fc66ba78bfabc1b985c864',1,'stdex::interval::size()'],['../classstdex_1_1stream_1_1basic__file.html#a5ce5b79bc42a41426debb10022ec0627',1,'stdex::stream::basic_file::size()'],['../classstdex_1_1stream_1_1file__window.html#af4a162cd43352b308f43be4520c72dbe',1,'stdex::stream::file_window::size()'],['../classstdex_1_1stream_1_1cache.html#ac984f9471425a3179f4b02694c83211a',1,'stdex::stream::cache::size()'],['../classstdex_1_1stream_1_1file.html#a020509db889ab8b1129e55a9c8ea1b09',1,'stdex::stream::file::size()'],['../classstdex_1_1stream_1_1memory__file.html#a0a163692d7d99a9942127ffc76775e1b',1,'stdex::stream::memory_file::size()'],['../classstdex_1_1stream_1_1fifo.html#a3272bc89573fe75fe0e6de2600967c10',1,'stdex::stream::fifo::size()'],['../classstdex_1_1stream_1_1diag__file.html#a53bbe3f837eaedd0639f988288b7470f',1,'stdex::stream::diag_file::size()'],['../classstdex_1_1vector__queue.html#ad704df8c3664a6d3f3e0977d87162114',1,'stdex::vector_queue::size() const']]], ['size_5ftype_35',['size_type',['../classstdex_1_1vector__queue.html#a2a044b4eb0242a00568d08b4d8b6343a',1,'stdex::vector_queue']]], diff --git a/search/all_14.js b/search/all_14.js index d3e0bb53e..81e02e63f 100644 --- a/search/all_14.js +++ b/search/all_14.js @@ -5,15 +5,16 @@ var searchData= ['window_2',['window',['../classstdex_1_1stream_1_1window.html',1,'stdex::stream']]], ['word_5findex_3',['word_index',['../structstdex_1_1html_1_1inserted__token.html#ada63f25062c74259e834a4ee0390d9a2',1,'stdex::html::inserted_token']]], ['worker_4',['worker',['../classstdex_1_1stream_1_1replicator_1_1worker.html',1,'stdex::stream::replicator']]], - ['write_5',['write',['../classstdex_1_1base64__writer.html#aaca6933a48a0266e4e46cc93b03ef410',1,'stdex::base64_writer::write()'],['../classstdex_1_1stream__hasher.html#aea835790f7aba9fb6ad28363eaaf736b',1,'stdex::stream_hasher::write()'],['../classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081',1,'stdex::stream::basic::write()'],['../classstdex_1_1stream_1_1converter.html#ae84a5c8d64942dbaa81ed54a181b3d7a',1,'stdex::stream::converter::write()'],['../classstdex_1_1stream_1_1replicator.html#abbbaa912a887b00a4a7a5d518079f5ec',1,'stdex::stream::replicator::write()'],['../classstdex_1_1stream_1_1async__writer.html#a3042b2405076e4995e6894d1303e12fe',1,'stdex::stream::async_writer::write()'],['../classstdex_1_1stream_1_1buffer.html#a489a01a4c187e85f06ebe10314a891ae',1,'stdex::stream::buffer::write()'],['../classstdex_1_1stream_1_1limiter.html#a8fe783b504f019e29034c0572cec7834',1,'stdex::stream::limiter::write()'],['../classstdex_1_1stream_1_1window.html#a06f05191c35fdbadebc49e05a19d9f3c',1,'stdex::stream::window::write()'],['../classstdex_1_1stream_1_1file__window.html#a7a264381cf344fcd6fa70e0a4964cc93',1,'stdex::stream::file_window::write()'],['../classstdex_1_1stream_1_1cache.html#ac436fbcac7eddf95b6e25d6368da3fb7',1,'stdex::stream::cache::write()'],['../classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618',1,'stdex::stream::basic_sys::write()'],['../classstdex_1_1stream_1_1socket.html#ad83f6d5d4844092e9e6831a597c6e2e9',1,'stdex::stream::socket::write()'],['../classstdex_1_1stream_1_1memory__file.html#ae5b6602e176f1053ab2eef88d8312b49',1,'stdex::stream::memory_file::write()'],['../classstdex_1_1stream_1_1fifo.html#a30c7adb43b6f4bd0cb5d9c72f15fe9bf',1,'stdex::stream::fifo::write()'],['../classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236',1,'stdex::stream::diag_file::write()'],['../classstdex_1_1zlib__writer.html#a4adcd2265f851bf880ea404ff35026f3',1,'stdex::zlib_writer::write()']]], - ['write_5farray_6',['write_array',['../classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a',1,'stdex::stream::basic::write_array(_In_reads_bytes_opt_(size *count) const void *array, size_t size, size_t count)'],['../classstdex_1_1stream_1_1basic.html#a01492b8338bf435a5240897085720814',1,'stdex::stream::basic::write_array(const T_from *str, charset_encoder< T_from, T_to > &encoder)'],['../classstdex_1_1stream_1_1basic.html#aeee42cba3d0a542355783241412f3630',1,'stdex::stream::basic::write_array(_In_reads_or_z_opt_(num_chars) const T_from *str, size_t num_chars, charset_encoder< T_from, T_to > &encoder)'],['../classstdex_1_1stream_1_1basic.html#ad67e1587fa4b072fe858d39e1eff020a',1,'stdex::stream::basic::write_array(const std::basic_string< T_from, TR, AX > &str, charset_encoder< T_from, T_to > &encoder)']]], - ['write_5fbyte_7',['write_byte',['../classstdex_1_1stream_1_1basic.html#af83cd6902f3f3bf18df2f08045570603',1,'stdex::stream::basic::write_byte()'],['../classstdex_1_1stream_1_1memory__file.html#a7d2187e9f98729b2c711a9cd242b7fc2',1,'stdex::stream::memory_file::write_byte()']]], - ['write_5fcharset_8',['write_charset',['../classstdex_1_1stream_1_1basic.html#ab61abc19936554288ea929e0eb299144',1,'stdex::stream::basic']]], - ['write_5fdata_9',['write_data',['../classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab',1,'stdex::stream::basic::write_data()'],['../classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332',1,'stdex::stream::memory_file::write_data()']]], - ['write_5flimit_10',['write_limit',['../classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873',1,'stdex::stream::limiter']]], - ['write_5foffset_11',['write_offset',['../classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3',1,'stdex::stream::window']]], - ['write_5fsprintf_12',['write_sprintf',['../classstdex_1_1stream_1_1basic.html#a63528d1cf030257c9d7f24d0d1d668f7',1,'stdex::stream::basic::write_sprintf(_Printf_format_string_params_(2) const char *format, locale_t locale,...)'],['../classstdex_1_1stream_1_1basic.html#a32f854944dc108d99c5ea5e87b19db7e',1,'stdex::stream::basic::write_sprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale,...)']]], - ['write_5fstr_13',['write_str',['../classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac',1,'stdex::stream::basic::write_str(const T *data)'],['../classstdex_1_1stream_1_1basic.html#aea03ce4ebc0ea6047dce9f18c900fcfa',1,'stdex::stream::basic::write_str(const std::basic_string< T, TR, AX > &data)'],['../classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd',1,'stdex::stream::memory_file::write_str(const T *data)'],['../classstdex_1_1stream_1_1memory__file.html#a1cdc0fac4ca1e480ff9ee67321b0cc45',1,'stdex::stream::memory_file::write_str(const std::basic_string< T, TR, AX > &data)']]], - ['write_5fstream_14',['write_stream',['../classstdex_1_1stream_1_1basic.html#ad28b193e6afa1352a00864bd28193cc2',1,'stdex::stream::basic::write_stream()'],['../classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7',1,'stdex::stream::memory_file::write_stream()']]], - ['write_5fvsprintf_15',['write_vsprintf',['../classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7',1,'stdex::stream::basic::write_vsprintf(_Printf_format_string_params_(2) const char *format, locale_t locale, va_list params)'],['../classstdex_1_1stream_1_1basic.html#a3a7ac9211cd81b2203b55f1a2f131bc1',1,'stdex::stream::basic::write_vsprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale, va_list params)']]] + ['worker_5fprogress_5',['worker_progress',['../classstdex_1_1aggregate__progress_1_1worker__progress.html',1,'stdex::aggregate_progress']]], + ['write_6',['write',['../classstdex_1_1base64__writer.html#aaca6933a48a0266e4e46cc93b03ef410',1,'stdex::base64_writer::write()'],['../classstdex_1_1stream__hasher.html#aea835790f7aba9fb6ad28363eaaf736b',1,'stdex::stream_hasher::write()'],['../classstdex_1_1stream_1_1basic.html#ad8af0444273509eb36ad81046ac92081',1,'stdex::stream::basic::write()'],['../classstdex_1_1stream_1_1converter.html#ae84a5c8d64942dbaa81ed54a181b3d7a',1,'stdex::stream::converter::write()'],['../classstdex_1_1stream_1_1replicator.html#abbbaa912a887b00a4a7a5d518079f5ec',1,'stdex::stream::replicator::write()'],['../classstdex_1_1stream_1_1async__writer.html#a3042b2405076e4995e6894d1303e12fe',1,'stdex::stream::async_writer::write()'],['../classstdex_1_1stream_1_1buffer.html#a489a01a4c187e85f06ebe10314a891ae',1,'stdex::stream::buffer::write()'],['../classstdex_1_1stream_1_1limiter.html#a8fe783b504f019e29034c0572cec7834',1,'stdex::stream::limiter::write()'],['../classstdex_1_1stream_1_1window.html#a06f05191c35fdbadebc49e05a19d9f3c',1,'stdex::stream::window::write()'],['../classstdex_1_1stream_1_1file__window.html#a7a264381cf344fcd6fa70e0a4964cc93',1,'stdex::stream::file_window::write()'],['../classstdex_1_1stream_1_1cache.html#ac436fbcac7eddf95b6e25d6368da3fb7',1,'stdex::stream::cache::write()'],['../classstdex_1_1stream_1_1basic__sys.html#a06666e09bf1e7486d277996267b51618',1,'stdex::stream::basic_sys::write()'],['../classstdex_1_1stream_1_1socket.html#ad83f6d5d4844092e9e6831a597c6e2e9',1,'stdex::stream::socket::write()'],['../classstdex_1_1stream_1_1memory__file.html#ae5b6602e176f1053ab2eef88d8312b49',1,'stdex::stream::memory_file::write()'],['../classstdex_1_1stream_1_1fifo.html#a30c7adb43b6f4bd0cb5d9c72f15fe9bf',1,'stdex::stream::fifo::write()'],['../classstdex_1_1stream_1_1diag__file.html#a3157aee8e9c754b02e876897fcb82236',1,'stdex::stream::diag_file::write()'],['../classstdex_1_1zlib__writer.html#a4adcd2265f851bf880ea404ff35026f3',1,'stdex::zlib_writer::write()']]], + ['write_5farray_7',['write_array',['../classstdex_1_1stream_1_1basic.html#af6c10ec4ab181b5ed5b061d115059b7a',1,'stdex::stream::basic::write_array(_In_reads_bytes_opt_(size *count) const void *array, size_t size, size_t count)'],['../classstdex_1_1stream_1_1basic.html#a01492b8338bf435a5240897085720814',1,'stdex::stream::basic::write_array(const T_from *str, charset_encoder< T_from, T_to > &encoder)'],['../classstdex_1_1stream_1_1basic.html#aeee42cba3d0a542355783241412f3630',1,'stdex::stream::basic::write_array(_In_reads_or_z_opt_(num_chars) const T_from *str, size_t num_chars, charset_encoder< T_from, T_to > &encoder)'],['../classstdex_1_1stream_1_1basic.html#ad67e1587fa4b072fe858d39e1eff020a',1,'stdex::stream::basic::write_array(const std::basic_string< T_from, TR, AX > &str, charset_encoder< T_from, T_to > &encoder)']]], + ['write_5fbyte_8',['write_byte',['../classstdex_1_1stream_1_1basic.html#af83cd6902f3f3bf18df2f08045570603',1,'stdex::stream::basic::write_byte()'],['../classstdex_1_1stream_1_1memory__file.html#a7d2187e9f98729b2c711a9cd242b7fc2',1,'stdex::stream::memory_file::write_byte()']]], + ['write_5fcharset_9',['write_charset',['../classstdex_1_1stream_1_1basic.html#ab61abc19936554288ea929e0eb299144',1,'stdex::stream::basic']]], + ['write_5fdata_10',['write_data',['../classstdex_1_1stream_1_1basic.html#acabab42a910d149fec6ef60090a34aab',1,'stdex::stream::basic::write_data()'],['../classstdex_1_1stream_1_1memory__file.html#ab0bcf389dd3540a5f978ef13dff5d332',1,'stdex::stream::memory_file::write_data()']]], + ['write_5flimit_11',['write_limit',['../classstdex_1_1stream_1_1limiter.html#af3d8db598efea694c0274b5420787873',1,'stdex::stream::limiter']]], + ['write_5foffset_12',['write_offset',['../classstdex_1_1stream_1_1window.html#a01d191d653be7a6d218c7feffa1b0ec3',1,'stdex::stream::window']]], + ['write_5fsprintf_13',['write_sprintf',['../classstdex_1_1stream_1_1basic.html#a63528d1cf030257c9d7f24d0d1d668f7',1,'stdex::stream::basic::write_sprintf(_Printf_format_string_params_(2) const char *format, locale_t locale,...)'],['../classstdex_1_1stream_1_1basic.html#a32f854944dc108d99c5ea5e87b19db7e',1,'stdex::stream::basic::write_sprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale,...)']]], + ['write_5fstr_14',['write_str',['../classstdex_1_1stream_1_1basic.html#a815369ef1a8ba07b289b8236fce018ac',1,'stdex::stream::basic::write_str(const T *data)'],['../classstdex_1_1stream_1_1basic.html#aea03ce4ebc0ea6047dce9f18c900fcfa',1,'stdex::stream::basic::write_str(const std::basic_string< T, TR, AX > &data)'],['../classstdex_1_1stream_1_1memory__file.html#ab8326c16c06548801982b07c930d7dfd',1,'stdex::stream::memory_file::write_str(const T *data)'],['../classstdex_1_1stream_1_1memory__file.html#a1cdc0fac4ca1e480ff9ee67321b0cc45',1,'stdex::stream::memory_file::write_str(const std::basic_string< T, TR, AX > &data)']]], + ['write_5fstream_15',['write_stream',['../classstdex_1_1stream_1_1basic.html#ad28b193e6afa1352a00864bd28193cc2',1,'stdex::stream::basic::write_stream()'],['../classstdex_1_1stream_1_1memory__file.html#a4216e7ae6e306170357aef1ea1c304c7',1,'stdex::stream::memory_file::write_stream()']]], + ['write_5fvsprintf_16',['write_vsprintf',['../classstdex_1_1stream_1_1basic.html#a14931af91db2bab8204d6352a59c1bf7',1,'stdex::stream::basic::write_vsprintf(_Printf_format_string_params_(2) const char *format, locale_t locale, va_list params)'],['../classstdex_1_1stream_1_1basic.html#a3a7ac9211cd81b2203b55f1a2f131bc1',1,'stdex::stream::basic::write_vsprintf(_Printf_format_string_params_(2) const wchar_t *format, locale_t locale, va_list params)']]] ]; diff --git a/search/all_16.js b/search/all_16.js index 1fc363f97..44b297e68 100644 --- a/search/all_16.js +++ b/search/all_16.js @@ -1,5 +1,6 @@ var searchData= [ - ['_7evector_5fqueue_0',['~vector_queue',['../classstdex_1_1vector__queue.html#a61460b8386f0ebc0a9c76db9951d342d',1,'stdex::vector_queue']]], - ['_7ewatchdog_1',['~watchdog',['../classstdex_1_1watchdog.html#a8ecedd7cd51129b3dc6775b638c91b16',1,'stdex::watchdog']]] + ['_7ebenchmark_0',['~benchmark',['../classstdex_1_1benchmark.html#ad84dd386789e370b4a8113d7bc39f663',1,'stdex::benchmark']]], + ['_7evector_5fqueue_1',['~vector_queue',['../classstdex_1_1vector__queue.html#a61460b8386f0ebc0a9c76db9951d342d',1,'stdex::vector_queue']]], + ['_7ewatchdog_2',['~watchdog',['../classstdex_1_1watchdog.html#a8ecedd7cd51129b3dc6775b638c91b16',1,'stdex::watchdog']]] ]; diff --git a/search/all_2.js b/search/all_2.js index 669a4fc80..a1cdddb49 100644 --- a/search/all_2.js +++ b/search/all_2.js @@ -3,14 +3,14 @@ var searchData= ['c_0',['stdex - Random stuff that didn't made it into std C++',['../index.html',1,'']]], ['cache_1',['cache',['../classstdex_1_1stream_1_1cache.html',1,'stdex::stream']]], ['cached_5ffile_2',['cached_file',['../classstdex_1_1stream_1_1cached__file.html',1,'stdex::stream::cached_file'],['../classstdex_1_1stream_1_1cached__file.html#aa53149a79b463450f64223f45285dc02',1,'stdex::stream::cached_file::cached_file(const schar_t *filename, int mode, size_t cache_size=default_cache_size)'],['../classstdex_1_1stream_1_1cached__file.html#ad788407862cb4e2b09de6067d906e293',1,'stdex::stream::cached_file::cached_file(const std::basic_string< TR, AX > &filename, int mode, size_t cache_size=default_cache_size)']]], - ['cancel_3',['cancel',['../classstdex_1_1progress.html#a03380c822297092b3bb9867deee26202',1,'stdex::progress::cancel()'],['../classstdex_1_1global__progress.html#a74a5ea9089ff7b7015ea4a2071f3113e',1,'stdex::global_progress::cancel()']]], + ['cancel_3',['cancel',['../classstdex_1_1progress.html#a03380c822297092b3bb9867deee26202',1,'stdex::progress::cancel()'],['../classstdex_1_1global__progress.html#a74a5ea9089ff7b7015ea4a2071f3113e',1,'stdex::global_progress::cancel()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#a61defd3930ff3a62d56890c80f60086a',1,'stdex::aggregate_progress::worker_progress::cancel()']]], ['capacity_4',['capacity',['../classstdex_1_1vector__queue.html#add3d6ed93d3c1471b80351c56639bab7',1,'stdex::vector_queue']]], ['charset_5',['charset',['../classstdex_1_1parser_1_1basic__mime__type.html#ae6906c756cc427d662bac8fd392e2f70',1,'stdex::parser::basic_mime_type::charset'],['../structstdex_1_1wav_1_1ltxt.html#a0a02bebe5034947c73de68b1a7edccc7',1,'stdex::wav::ltxt::charset'],['../structstdex_1_1wav_1_1cue__ex.html#a6cc8057f9a324ca1283e7ebd9756e1d0',1,'stdex::wav::cue_ex::charset']]], ['charset_5fencoder_6',['charset_encoder',['../classstdex_1_1charset__encoder.html',1,'stdex']]], ['check_5fdigits_7',['check_digits',['../classstdex_1_1parser_1_1basic__iban.html#a66ebb27363905e455f7bf6e405d418c4',1,'stdex::parser::basic_iban::check_digits'],['../classstdex_1_1parser_1_1basic__creditor__reference.html#a4885b1b2c4a90041a970323fe8300be3',1,'stdex::parser::basic_creditor_reference::check_digits']]], ['chunk_5fid_8',['chunk_id',['../structstdex_1_1wav_1_1cue.html#a15ae22213cb33bc694965e97a3035342',1,'stdex::wav::cue']]], ['chunk_5foffset_9',['chunk_offset',['../structstdex_1_1wav_1_1cue.html#a9e1a1a62c1497e28161b1303c769a59f',1,'stdex::wav::cue']]], - ['clear_10',['clear',['../classstdex_1_1base64__enc.html#afb6a85176589d9ce1f65ce6355592fe7',1,'stdex::base64_enc::clear()'],['../classstdex_1_1base64__dec.html#a94738b63789489022e0c16063b732305',1,'stdex::base64_dec::clear()'],['../classstdex_1_1basic__hash.html#af5e2ff7b83da5a663fa3c9766734b771',1,'stdex::basic_hash::clear()'],['../classstdex_1_1block__hash.html#a8750f9c24cd22bd879dc638256534aec',1,'stdex::block_hash::clear()'],['../classstdex_1_1crc32__hash.html#addf745566fe5a1ba3f947a70603ea235',1,'stdex::crc32_hash::clear()'],['../classstdex_1_1md5__hash.html#a0952042043c10e184d9ee8a79421cc0f',1,'stdex::md5_hash::clear()'],['../classstdex_1_1sha1__hash.html#a36f38887f8e90f88df0a420f0011b9b3',1,'stdex::sha1_hash::clear()'],['../classstdex_1_1hex__dec.html#a282bf5db0d16b29b12c71b73d3a33cc4',1,'stdex::hex_dec::clear()'],['../classstdex_1_1html_1_1document.html#aecb7a14d12137d624dfe5378f27ab70c',1,'stdex::html::document::clear()'],['../classstdex_1_1vector__queue.html#a93259be5f471580d2f8d7bee41032f9b',1,'stdex::vector_queue::clear()']]], + ['clear_10',['clear',['../classstdex_1_1base64__enc.html#afb6a85176589d9ce1f65ce6355592fe7',1,'stdex::base64_enc::clear()'],['../classstdex_1_1base64__dec.html#a94738b63789489022e0c16063b732305',1,'stdex::base64_dec::clear()'],['../classstdex_1_1basic__hash.html#af5e2ff7b83da5a663fa3c9766734b771',1,'stdex::basic_hash::clear()'],['../classstdex_1_1block__hash.html#a8750f9c24cd22bd879dc638256534aec',1,'stdex::block_hash::clear()'],['../classstdex_1_1crc32__hash.html#addf745566fe5a1ba3f947a70603ea235',1,'stdex::crc32_hash::clear()'],['../classstdex_1_1md5__hash.html#a0952042043c10e184d9ee8a79421cc0f',1,'stdex::md5_hash::clear()'],['../classstdex_1_1sha1__hash.html#a36f38887f8e90f88df0a420f0011b9b3',1,'stdex::sha1_hash::clear()'],['../classstdex_1_1hex__dec.html#a282bf5db0d16b29b12c71b73d3a33cc4',1,'stdex::hex_dec::clear()'],['../classstdex_1_1html_1_1document.html#aecb7a14d12137d624dfe5378f27ab70c',1,'stdex::html::document::clear()'],['../classstdex_1_1pool.html#a96acba9575913aa2c1a4179f84673c77',1,'stdex::pool::clear()'],['../classstdex_1_1vector__queue.html#a93259be5f471580d2f8d7bee41032f9b',1,'stdex::vector_queue::clear()']]], ['close_11',['close',['../classstdex_1_1idrec_1_1record.html#a9fb4bee3afca4803a36767e3181a35b9',1,'stdex::idrec::record::close(std::ostream &stream, std::streamoff start)'],['../classstdex_1_1idrec_1_1record.html#a73697f4572d009b34c9a9ba66993391a',1,'stdex::idrec::record::close(stdex::stream::basic_file &stream, stdex::stream::foff_t start)'],['../classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b',1,'stdex::stream::basic::close()'],['../classstdex_1_1stream_1_1converter.html#a96c368204acf32239318a026762cd22c',1,'stdex::stream::converter::close()'],['../classstdex_1_1stream_1_1replicator.html#afa3e2cec6e254e7bb53cc5e1b1ea0f90',1,'stdex::stream::replicator::close()'],['../classstdex_1_1stream_1_1file__window.html#acace60a7ba95a139852f85aa4232bb14',1,'stdex::stream::file_window::close()'],['../classstdex_1_1stream_1_1cache.html#aa88074bb669bcb654e027b76e32a2799',1,'stdex::stream::cache::close()'],['../classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc',1,'stdex::stream::basic_sys::close()'],['../classstdex_1_1stream_1_1socket.html#a74e2f261c117cf8f20866632fb79b3c5',1,'stdex::stream::socket::close()'],['../classstdex_1_1stream_1_1memory__file.html#a4cf33faaf1686335bd3e3a7e72813dd6',1,'stdex::stream::memory_file::close()'],['../classstdex_1_1stream_1_1fifo.html#a29e0a95836f4e2692bea3783acaf692d',1,'stdex::stream::fifo::close()'],['../classstdex_1_1stream_1_1diag__file.html#a4367a6d2840c1a2c5d9ab2ab3483ed2c',1,'stdex::stream::diag_file::close()'],['../classstdex_1_1sys__object.html#ab8c0119bc4958f78f51ef2f3b7c91f66',1,'stdex::sys_object::close()'],['../classstdex_1_1sys__object.html#acbb82c6c1fce7ee39518f94b1209b0b8',1,'stdex::sys_object::close(sys_handle h)']]], ['code_12',['code',['../classstdex_1_1html_1_1element.html#acad269ffc367d3a7df7cb42fed0ed486',1,'stdex::html::element::code'],['../classstdex_1_1html_1_1element__end.html#ae84212100b568b2ba305592b93219f5a',1,'stdex::html::element_end::code']]], ['comment_13',['comment',['../classstdex_1_1html_1_1comment.html',1,'stdex::html']]], diff --git a/search/all_3.js b/search/all_3.js index aa63b9edf..33c78efc8 100644 --- a/search/all_3.js +++ b/search/all_3.js @@ -8,7 +8,7 @@ var searchData= ['declaration_5',['declaration',['../classstdex_1_1html_1_1declaration.html',1,'stdex::html']]], ['decode_6',['decode',['../classstdex_1_1base64__dec.html#a94b0860b19c61f53208b79fcfd1ac32f',1,'stdex::base64_dec::decode(std::vector< T_to, AX > &out, bool &is_last, const T_from *data, size_t size)'],['../classstdex_1_1base64__dec.html#a07976a85f83981a29f9e1395d883a36d',1,'stdex::base64_dec::decode(std::vector< T, AX > &out)'],['../classstdex_1_1base64__reader.html#a523ece0190b031882162c7e4edd33fbb',1,'stdex::base64_reader::decode()'],['../classstdex_1_1hex__dec.html#a860e727d082f427ea6b434489c77f813',1,'stdex::hex_dec::decode()']]], ['description_7',['description',['../structstdex_1_1wav_1_1ltxt.html#aabb5c8ea28e9002fb5e32867c23f764e',1,'stdex::wav::ltxt::description'],['../structstdex_1_1wav_1_1cue__ex.html#a35b364ba9cb24b1f992cc8284046a108',1,'stdex::wav::cue_ex::description']]], - ['detach_8',['detach',['../classstdex_1_1global__progress.html#aa2c5391aa2f1f30e72a700768bc52f84',1,'stdex::global_progress']]], + ['detach_8',['detach',['../classstdex_1_1global__progress.html#aa2c5391aa2f1f30e72a700768bc52f84',1,'stdex::global_progress::detach()'],['../classstdex_1_1aggregate__progress.html#acec6e7132735143aaee405948821803f',1,'stdex::aggregate_progress::detach()']]], ['diag_5ffile_9',['diag_file',['../classstdex_1_1stream_1_1diag__file.html',1,'stdex::stream']]], ['dialect_10',['dialect',['../structstdex_1_1wav_1_1ltxt.html#af5a6cbae259ede87a96cc16866953b1f',1,'stdex::wav::ltxt::dialect'],['../structstdex_1_1wav_1_1cue__ex.html#adc67de502f7689e67b6b8a4b5b65d47c',1,'stdex::wav::cue_ex::dialect']]], ['didn_20t_20made_20it_20into_20std_20c_11',['stdex - Random stuff that didn't made it into std C++',['../index.html',1,'']]], diff --git a/search/all_6.js b/search/all_6.js index e7d030add..67090f86f 100644 --- a/search/all_6.js +++ b/search/all_6.js @@ -1,6 +1,6 @@ var searchData= [ ['get_0',['get',['../classstdex_1_1stream_1_1socket.html#a48f512c2f87d27c40d630ecbd9837d3c',1,'stdex::stream::socket::get()'],['../classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1',1,'stdex::stream::memory_file::get()'],['../classstdex_1_1sys__object.html#a68edd83d50aee1dd85645aa0506c8769',1,'stdex::sys_object::get()']]], - ['global_5fprogress_1',['global_progress',['../classstdex_1_1global__progress.html',1,'stdex::global_progress< T >'],['../classstdex_1_1global__progress.html#a0ffa6fafa04588c0df06d077ae51d037',1,'stdex::global_progress::global_progress()']]], + ['global_5fprogress_1',['global_progress',['../classstdex_1_1global__progress.html',1,'stdex::global_progress< T >'],['../classstdex_1_1global__progress.html#ad65b4efb79010d917ea66b1acf455560',1,'stdex::global_progress::global_progress()']]], ['gsm_5f6_5f10_2',['gsm_6_10',['../structstdex_1_1wav_1_1format.html#a9e48aadca63b92583abda67513aa4553a65272ddf98e4ddbea87abd0e2aebba6c',1,'stdex::wav::format']]] ]; diff --git a/search/all_c.js b/search/all_c.js index 675fc583f..876c50010 100644 --- a/search/all_c.js +++ b/search/all_c.js @@ -15,6 +15,6 @@ var searchData= ['operator_3d_12',['operator=',['../classstdex_1_1idrec_1_1record.html#a07934d315566b6ad40edbc5f93cb5978',1,'stdex::idrec::record::operator=()'],['../classstdex_1_1stream_1_1memory__file.html#a8864aed603e57ceb982956ce05da8b68',1,'stdex::stream::memory_file::operator=(const memory_file &other)'],['../classstdex_1_1stream_1_1memory__file.html#a053bad774ae0343bcc5d05b5108a5a90',1,'stdex::stream::memory_file::operator=(memory_file &&other) noexcept'],['../classstdex_1_1vector__queue.html#a00e42f0b6c31aa16e47a1093e90fd1aa',1,'stdex::vector_queue::operator=(const vector_queue< value_type > &other)'],['../classstdex_1_1vector__queue.html#a840d69192e880fcce588c6368a7d1bab',1,'stdex::vector_queue::operator=(vector_queue< value_type > &&other)']]], ['operator_3d_3d_13',['operator==',['../structstdex_1_1interval.html#a9da38b025dbd14ebded9fd06720a2345',1,'stdex::interval::operator==()'],['../structstdex_1_1mapping.html#a6d9fa746849e2ea27f53e40b8b44fb46',1,'stdex::mapping::operator==()']]], ['operator_3e_3e_14',['operator>>',['../classstdex_1_1idrec_1_1record.html#a8f2fa168ba01d9df647e166a9799bd63',1,'stdex::idrec::record::operator>>'],['../classstdex_1_1idrec_1_1record.html#a74a44367e182a7c1ce600e61495aa7ff',1,'stdex::idrec::record::operator>>'],['../classstdex_1_1idrec_1_1record.html#a944280f0451d647f8b32bd0082937864',1,'stdex::idrec::record::operator>>']]], - ['operator_5b_5d_15',['operator[]',['../classstdex_1_1vector__queue.html#a21497b5396ef80a2d641f8ee767a3b17',1,'stdex::vector_queue::operator[](size_type pos)'],['../classstdex_1_1vector__queue.html#ace07c52caf736c3285909d64b22a2c4c',1,'stdex::vector_queue::operator[](size_type pos) const']]], + ['operator_5b_5d_15',['operator[]',['../classstdex_1_1aggregate__progress.html#a431650892bd6133b6c781cf33b1a5d24',1,'stdex::aggregate_progress::operator[]()'],['../classstdex_1_1vector__queue.html#a21497b5396ef80a2d641f8ee767a3b17',1,'stdex::vector_queue::operator[](size_type pos)'],['../classstdex_1_1vector__queue.html#ace07c52caf736c3285909d64b22a2c4c',1,'stdex::vector_queue::operator[](size_type pos) const']]], ['os_5fplatform_16',['os_platform',['../structstdex_1_1sys__info__t.html#acd4a96851f4100095f812dc945b1d7d0',1,'stdex::sys_info_t']]] ]; diff --git a/search/classes_0.js b/search/classes_0.js index 5e788403b..65b56406b 100644 --- a/search/classes_0.js +++ b/search/classes_0.js @@ -1,7 +1,8 @@ var searchData= [ - ['aosn_5fdate_0',['aosn_date',['../structstdex_1_1chrono_1_1aosn__date.html',1,'stdex::chrono']]], - ['aosn_5ftimestamp_1',['aosn_timestamp',['../structstdex_1_1chrono_1_1aosn__timestamp.html',1,'stdex::chrono']]], - ['async_5freader_2',['async_reader',['../classstdex_1_1stream_1_1async__reader.html',1,'stdex::stream']]], - ['async_5fwriter_3',['async_writer',['../classstdex_1_1stream_1_1async__writer.html',1,'stdex::stream']]] + ['aggregate_5fprogress_0',['aggregate_progress',['../classstdex_1_1aggregate__progress.html',1,'stdex']]], + ['aosn_5fdate_1',['aosn_date',['../structstdex_1_1chrono_1_1aosn__date.html',1,'stdex::chrono']]], + ['aosn_5ftimestamp_2',['aosn_timestamp',['../structstdex_1_1chrono_1_1aosn__timestamp.html',1,'stdex::chrono']]], + ['async_5freader_3',['async_reader',['../classstdex_1_1stream_1_1async__reader.html',1,'stdex::stream']]], + ['async_5fwriter_4',['async_writer',['../classstdex_1_1stream_1_1async__writer.html',1,'stdex::stream']]] ]; diff --git a/search/classes_1.js b/search/classes_1.js index 708d98fea..3cb71fdaf 100644 --- a/search/classes_1.js +++ b/search/classes_1.js @@ -84,10 +84,11 @@ var searchData= ['basic_5furl_5fpath_5fchar_3c_20char_20_3e_81',['basic_url_path_char< char >',['../classstdex_1_1parser_1_1basic__url__path__char.html',1,'stdex::parser']]], ['basic_5furl_5fusername_5fchar_82',['basic_url_username_char',['../classstdex_1_1parser_1_1basic__url__username__char.html',1,'stdex::parser']]], ['basic_5furl_5fusername_5fchar_3c_20char_20_3e_83',['basic_url_username_char< char >',['../classstdex_1_1parser_1_1basic__url__username__char.html',1,'stdex::parser']]], - ['block_5fhash_84',['block_hash',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['block_5fhash_3c_20md5_5ft_20_3e_85',['block_hash< md5_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['block_5fhash_3c_20sha1_5ft_20_3e_86',['block_hash< sha1_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], - ['buffer_87',['buffer',['../classstdex_1_1stream_1_1buffer.html',1,'stdex::stream']]], - ['buffer_5ft_88',['buffer_t',['../structstdex_1_1stream_1_1buffer_1_1buffer__t.html',1,'stdex::stream::buffer']]], - ['buffered_5fsys_89',['buffered_sys',['../classstdex_1_1stream_1_1buffered__sys.html',1,'stdex::stream']]] + ['benchmark_84',['benchmark',['../classstdex_1_1benchmark.html',1,'stdex']]], + ['block_5fhash_85',['block_hash',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['block_5fhash_3c_20md5_5ft_20_3e_86',['block_hash< md5_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['block_5fhash_3c_20sha1_5ft_20_3e_87',['block_hash< sha1_t >',['../classstdex_1_1block__hash.html',1,'stdex']]], + ['buffer_88',['buffer',['../classstdex_1_1stream_1_1buffer.html',1,'stdex::stream']]], + ['buffer_5ft_89',['buffer_t',['../structstdex_1_1stream_1_1buffer_1_1buffer__t.html',1,'stdex::stream::buffer']]], + ['buffered_5fsys_90',['buffered_sys',['../classstdex_1_1stream_1_1buffered__sys.html',1,'stdex::stream']]] ]; diff --git a/search/classes_12.js b/search/classes_12.js index cdb3c413f..15008aed4 100644 --- a/search/classes_12.js +++ b/search/classes_12.js @@ -3,5 +3,6 @@ var searchData= ['watchdog_0',['watchdog',['../classstdex_1_1watchdog.html',1,'stdex']]], ['wave_1',['wave',['../structstdex_1_1wav_1_1wave.html',1,'stdex::wav']]], ['window_2',['window',['../classstdex_1_1stream_1_1window.html',1,'stdex::stream']]], - ['worker_3',['worker',['../classstdex_1_1stream_1_1replicator_1_1worker.html',1,'stdex::stream::replicator']]] + ['worker_3',['worker',['../classstdex_1_1stream_1_1replicator_1_1worker.html',1,'stdex::stream::replicator']]], + ['worker_5fprogress_4',['worker_progress',['../classstdex_1_1aggregate__progress_1_1worker__progress.html',1,'stdex::aggregate_progress']]] ]; diff --git a/search/functions_0.js b/search/functions_0.js index fc528d20e..e4e8a0a8e 100644 --- a/search/functions_0.js +++ b/search/functions_0.js @@ -2,13 +2,14 @@ var searchData= [ ['abs_0',['abs',['../classstdex_1_1vector__queue.html#ae31dd1a45546dc1ff91eaa82b97c0e1b',1,'stdex::vector_queue']]], ['active_5felement_1',['active_element',['../classstdex_1_1html_1_1document.html#a854a42ac5d1b44a663992571ce016a5a',1,'stdex::html::document']]], - ['append_2',['append',['../classstdex_1_1html_1_1document.html#a273b8b833d039824d048517d80295f94',1,'stdex::html::document']]], - ['append_5finserted_5ftokens_3',['append_inserted_tokens',['../classstdex_1_1html_1_1parser.html#a00f6f82ed5807d87f1b16af89f03226a',1,'stdex::html::parser']]], - ['append_5ftag_4',['append_tag',['../classstdex_1_1html_1_1token.html#af5ccf4221ba4739d91daffced7683e9e',1,'stdex::html::token::append_tag(std::basic_string< char, TR, AX > &str) const'],['../classstdex_1_1html_1_1token.html#abd4f24cfd401b7f48f7ac2fd6c4bd5ff',1,'stdex::html::token::append_tag(std::basic_string< wchar_t, TR, AX > &str) const']]], - ['append_5ftoken_5',['append_token',['../classstdex_1_1html_1_1parser.html#a8a28b266d7a373183f11912d180423d2',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token)'],['../classstdex_1_1html_1_1parser.html#acddefe7c4a28d9ddfb128e160dcaa3c4',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token, std::basic_string< T, TR, AX > &source)']]], - ['assign_6',['assign',['../classstdex_1_1html_1_1document.html#ae2fe171fbcaa696fd3eecd633491f4af',1,'stdex::html::document']]], - ['at_7',['at',['../classstdex_1_1vector__queue.html#ae135f77af0deabaa5f2cfe5ca25b9f09',1,'stdex::vector_queue::at(size_type pos)'],['../classstdex_1_1vector__queue.html#ac2b559184798a59ee5fed26f27d92e3c',1,'stdex::vector_queue::at(size_type pos) const']]], - ['at_5fabs_8',['at_abs',['../classstdex_1_1vector__queue.html#a881da485c13dcee1d35245570420877a',1,'stdex::vector_queue::at_abs(size_type pos)'],['../classstdex_1_1vector__queue.html#afee762c3280d33544ce8dd8ad20af40b',1,'stdex::vector_queue::at_abs(size_type pos) const']]], - ['atime_9',['atime',['../classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826',1,'stdex::stream::basic_file::atime()'],['../classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7',1,'stdex::stream::cache::atime()'],['../classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3',1,'stdex::stream::file::atime()']]], - ['attach_10',['attach',['../classstdex_1_1global__progress.html#aec91532fde2500a5458a397f91c88769',1,'stdex::global_progress']]] + ['aggregate_5fprogress_2',['aggregate_progress',['../classstdex_1_1aggregate__progress.html#ae832067bbc39765c8e53c2f6434f885a',1,'stdex::aggregate_progress']]], + ['append_3',['append',['../classstdex_1_1html_1_1document.html#a273b8b833d039824d048517d80295f94',1,'stdex::html::document']]], + ['append_5finserted_5ftokens_4',['append_inserted_tokens',['../classstdex_1_1html_1_1parser.html#a00f6f82ed5807d87f1b16af89f03226a',1,'stdex::html::parser']]], + ['append_5ftag_5',['append_tag',['../classstdex_1_1html_1_1token.html#af5ccf4221ba4739d91daffced7683e9e',1,'stdex::html::token::append_tag(std::basic_string< char, TR, AX > &str) const'],['../classstdex_1_1html_1_1token.html#abd4f24cfd401b7f48f7ac2fd6c4bd5ff',1,'stdex::html::token::append_tag(std::basic_string< wchar_t, TR, AX > &str) const']]], + ['append_5ftoken_6',['append_token',['../classstdex_1_1html_1_1parser.html#a8a28b266d7a373183f11912d180423d2',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token)'],['../classstdex_1_1html_1_1parser.html#acddefe7c4a28d9ddfb128e160dcaa3c4',1,'stdex::html::parser::append_token(std::unique_ptr< T_token > &&token, std::basic_string< T, TR, AX > &source)']]], + ['assign_7',['assign',['../classstdex_1_1html_1_1document.html#ae2fe171fbcaa696fd3eecd633491f4af',1,'stdex::html::document']]], + ['at_8',['at',['../classstdex_1_1vector__queue.html#ae135f77af0deabaa5f2cfe5ca25b9f09',1,'stdex::vector_queue::at(size_type pos)'],['../classstdex_1_1vector__queue.html#ac2b559184798a59ee5fed26f27d92e3c',1,'stdex::vector_queue::at(size_type pos) const']]], + ['at_5fabs_9',['at_abs',['../classstdex_1_1vector__queue.html#a881da485c13dcee1d35245570420877a',1,'stdex::vector_queue::at_abs(size_type pos)'],['../classstdex_1_1vector__queue.html#afee762c3280d33544ce8dd8ad20af40b',1,'stdex::vector_queue::at_abs(size_type pos) const']]], + ['atime_10',['atime',['../classstdex_1_1stream_1_1basic__file.html#a84936e230100934793aad8a516efa826',1,'stdex::stream::basic_file::atime()'],['../classstdex_1_1stream_1_1cache.html#a5fd8962b5a49d549a36d96f3e8919cd7',1,'stdex::stream::cache::atime()'],['../classstdex_1_1stream_1_1file.html#a4b5cdfe6c9dccd20726df867e34f4af3',1,'stdex::stream::file::atime()']]], + ['attach_11',['attach',['../classstdex_1_1global__progress.html#aec91532fde2500a5458a397f91c88769',1,'stdex::global_progress::attach()'],['../classstdex_1_1aggregate__progress.html#a4f41de4cbad813446edd060bea1e92f2',1,'stdex::aggregate_progress::attach()']]] ]; diff --git a/search/functions_1.js b/search/functions_1.js index a7cef70bf..809ded82d 100644 --- a/search/functions_1.js +++ b/search/functions_1.js @@ -2,5 +2,6 @@ var searchData= [ ['back_0',['back',['../classstdex_1_1ring.html#a758a2e9010d402e3eb6114b70cfa095e',1,'stdex::ring::back()'],['../classstdex_1_1vector__queue.html#a564c31d1a260f9f210541b7fd4803d3e',1,'stdex::vector_queue::back()'],['../classstdex_1_1vector__queue.html#a4a76efc22a2e2b9310b541ba44fd05e9',1,'stdex::vector_queue::back() const']]], ['base64_5fdec_1',['base64_dec',['../classstdex_1_1base64__dec.html#a17d956a883e99d8d884d2cb2edade8c5',1,'stdex::base64_dec']]], - ['base64_5fenc_2',['base64_enc',['../classstdex_1_1base64__enc.html#abc6c72530634c3fea8168710ab5b1a28',1,'stdex::base64_enc']]] + ['base64_5fenc_2',['base64_enc',['../classstdex_1_1base64__enc.html#abc6c72530634c3fea8168710ab5b1a28',1,'stdex::base64_enc']]], + ['benchmark_3',['benchmark',['../classstdex_1_1benchmark.html#a004f16b1c20325b8fbb578f250c406c4',1,'stdex::benchmark']]] ]; diff --git a/search/functions_10.js b/search/functions_10.js index 56260e0af..acd4b51a9 100644 --- a/search/functions_10.js +++ b/search/functions_10.js @@ -5,15 +5,15 @@ var searchData= ['seekbeg_2',['seekbeg',['../classstdex_1_1stream_1_1basic__file.html#a6a8da9a1b0a3926b9bc453bf0209ee5e',1,'stdex::stream::basic_file']]], ['seekcur_3',['seekcur',['../classstdex_1_1stream_1_1basic__file.html#a8158cb89ef54a737b7bcfed635c215d6',1,'stdex::stream::basic_file']]], ['seekend_4',['seekend',['../classstdex_1_1stream_1_1basic__file.html#ae13b5941415b3dbb9883c1da9bcd39c7',1,'stdex::stream::basic_file']]], - ['set_5',['set',['../classstdex_1_1progress.html#acf3a29daf22709bf7e94e864c8be95a1',1,'stdex::progress::set()'],['../classstdex_1_1lazy__progress.html#a4e3e7a80da8cce7ccec69c78fcaaabae',1,'stdex::lazy_progress::set()'],['../classstdex_1_1global__progress.html#a76e66104444c77b89b687b4ad4945e8e',1,'stdex::global_progress::set()'],['../classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571',1,'stdex::stream::memory_file::set()']]], + ['set_5',['set',['../classstdex_1_1progress.html#acf3a29daf22709bf7e94e864c8be95a1',1,'stdex::progress::set()'],['../classstdex_1_1lazy__progress.html#a4e3e7a80da8cce7ccec69c78fcaaabae',1,'stdex::lazy_progress::set()'],['../classstdex_1_1global__progress.html#a76e66104444c77b89b687b4ad4945e8e',1,'stdex::global_progress::set()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#a61a1f4accad5a1243e1bbf4084205bef',1,'stdex::aggregate_progress::worker_progress::set()'],['../classstdex_1_1stream_1_1memory__file.html#a8ccb02a23999882255d5c16c83f91571',1,'stdex::stream::memory_file::set()']]], ['set_5fatime_6',['set_atime',['../classstdex_1_1stream_1_1basic__file.html#ae76436514ac66d88bbd584ea07d879d0',1,'stdex::stream::basic_file::set_atime()'],['../classstdex_1_1stream_1_1cache.html#af026881969ee78e2aef1bf02922aea93',1,'stdex::stream::cache::set_atime()'],['../classstdex_1_1stream_1_1file.html#a64ded627a8843c155ea3a59b94c225f6',1,'stdex::stream::file::set_atime()']]], ['set_5fctime_7',['set_ctime',['../classstdex_1_1stream_1_1basic__file.html#aba668e53fc4709cd545f12a49521ed56',1,'stdex::stream::basic_file::set_ctime()'],['../classstdex_1_1stream_1_1cache.html#ae62a75156ff79910e1b9afc506e38e44',1,'stdex::stream::cache::set_ctime()'],['../classstdex_1_1stream_1_1file.html#a337a27cd63975e155b6ba29a18ed9a23',1,'stdex::stream::file::set_ctime()']]], ['set_5fglobal_5frange_8',['set_global_range',['../classstdex_1_1global__progress.html#ac68b491c62861fae1b16abb3477cb9c1',1,'stdex::global_progress']]], ['set_5fmtime_9',['set_mtime',['../classstdex_1_1stream_1_1basic__file.html#a814a080cb6da2041013749cc125bfd2b',1,'stdex::stream::basic_file::set_mtime()'],['../classstdex_1_1stream_1_1cache.html#aafad7bfb4c03d0d56854b4c148ae0ee1',1,'stdex::stream::cache::set_mtime()'],['../classstdex_1_1stream_1_1file.html#a567620d1eb84032e460f3e173f9bd762',1,'stdex::stream::file::set_mtime()']]], - ['set_5frange_10',['set_range',['../classstdex_1_1progress.html#afbb1513bdb20340ebb21bd988f4e424a',1,'stdex::progress::set_range()'],['../classstdex_1_1lazy__progress.html#ada3a0d4f0086823558115a8064ffffb6',1,'stdex::lazy_progress::set_range()'],['../classstdex_1_1global__progress.html#afb204b820637c19b494976af4a284704',1,'stdex::global_progress::set_range(T start, T end)']]], + ['set_5frange_10',['set_range',['../classstdex_1_1progress.html#afbb1513bdb20340ebb21bd988f4e424a',1,'stdex::progress::set_range()'],['../classstdex_1_1lazy__progress.html#ada3a0d4f0086823558115a8064ffffb6',1,'stdex::lazy_progress::set_range()'],['../classstdex_1_1global__progress.html#afb204b820637c19b494976af4a284704',1,'stdex::global_progress::set_range()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#ab11e34d7b3bb61db20f98379813f3ad6',1,'stdex::aggregate_progress::worker_progress::set_range()']]], ['set_5fsection_5frange_11',['set_section_range',['../classstdex_1_1global__progress.html#a242009bce7ac595975bbfd703ec58c3b',1,'stdex::global_progress']]], - ['set_5ftext_12',['set_text',['../classstdex_1_1progress.html#a2cab8b5ac137d16fced31ee205264b01',1,'stdex::progress::set_text()'],['../classstdex_1_1global__progress.html#a89b7116003ab3b6344d90f130c14933e',1,'stdex::global_progress::set_text()']]], - ['show_13',['show',['../classstdex_1_1progress.html#ab6e57aed9e7a18a501e8a63cef199d8e',1,'stdex::progress::show()'],['../classstdex_1_1global__progress.html#a32350e02d5904867402187e81a3c4a26',1,'stdex::global_progress::show()']]], + ['set_5ftext_12',['set_text',['../classstdex_1_1progress.html#a2cab8b5ac137d16fced31ee205264b01',1,'stdex::progress::set_text()'],['../classstdex_1_1global__progress.html#a89b7116003ab3b6344d90f130c14933e',1,'stdex::global_progress::set_text()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#ae84e8b08865cf05024e8a777d9a75711',1,'stdex::aggregate_progress::worker_progress::set_text()']]], + ['show_13',['show',['../classstdex_1_1progress.html#ab6e57aed9e7a18a501e8a63cef199d8e',1,'stdex::progress::show()'],['../classstdex_1_1global__progress.html#a32350e02d5904867402187e81a3c4a26',1,'stdex::global_progress::show()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#aa48fb208c1bf38d041669e4b1d0b8a46',1,'stdex::aggregate_progress::worker_progress::show()']]], ['size_14',['size',['../classstdex_1_1basic__hash.html#a9b8b5f91873e5d2cfe93533832318b5a',1,'stdex::basic_hash::size()'],['../structstdex_1_1interval.html#a8c5222bc73fc66ba78bfabc1b985c864',1,'stdex::interval::size()'],['../classstdex_1_1stream_1_1basic__file.html#a5ce5b79bc42a41426debb10022ec0627',1,'stdex::stream::basic_file::size()'],['../classstdex_1_1stream_1_1file__window.html#af4a162cd43352b308f43be4520c72dbe',1,'stdex::stream::file_window::size()'],['../classstdex_1_1stream_1_1cache.html#ac984f9471425a3179f4b02694c83211a',1,'stdex::stream::cache::size()'],['../classstdex_1_1stream_1_1file.html#a020509db889ab8b1129e55a9c8ea1b09',1,'stdex::stream::file::size()'],['../classstdex_1_1stream_1_1memory__file.html#a0a163692d7d99a9942127ffc76775e1b',1,'stdex::stream::memory_file::size()'],['../classstdex_1_1stream_1_1fifo.html#a3272bc89573fe75fe0e6de2600967c10',1,'stdex::stream::fifo::size()'],['../classstdex_1_1stream_1_1diag__file.html#a53bbe3f837eaedd0639f988288b7470f',1,'stdex::stream::diag_file::size()'],['../classstdex_1_1vector__queue.html#ad704df8c3664a6d3f3e0977d87162114',1,'stdex::vector_queue::size()']]], ['skip_15',['skip',['../classstdex_1_1stream_1_1basic.html#a52ce3bdf28a9a7fc5a881616c8db2da4',1,'stdex::stream::basic::skip()'],['../classstdex_1_1stream_1_1basic__file.html#a15a1e6a778adefea421f32d14c8178dd',1,'stdex::stream::basic_file::skip()'],['../classstdex_1_1stream_1_1file__window.html#a4202fcc2b9e69e40bf15aaa3b5f50dda',1,'stdex::stream::file_window::skip()']]], ['socket_16',['socket',['../classstdex_1_1stream_1_1socket.html#aae9f08b885315a555d46faee399196c9',1,'stdex::stream::socket']]], diff --git a/search/functions_15.js b/search/functions_15.js index 1fc363f97..44b297e68 100644 --- a/search/functions_15.js +++ b/search/functions_15.js @@ -1,5 +1,6 @@ var searchData= [ - ['_7evector_5fqueue_0',['~vector_queue',['../classstdex_1_1vector__queue.html#a61460b8386f0ebc0a9c76db9951d342d',1,'stdex::vector_queue']]], - ['_7ewatchdog_1',['~watchdog',['../classstdex_1_1watchdog.html#a8ecedd7cd51129b3dc6775b638c91b16',1,'stdex::watchdog']]] + ['_7ebenchmark_0',['~benchmark',['../classstdex_1_1benchmark.html#ad84dd386789e370b4a8113d7bc39f663',1,'stdex::benchmark']]], + ['_7evector_5fqueue_1',['~vector_queue',['../classstdex_1_1vector__queue.html#a61460b8386f0ebc0a9c76db9951d342d',1,'stdex::vector_queue']]], + ['_7ewatchdog_2',['~watchdog',['../classstdex_1_1watchdog.html#a8ecedd7cd51129b3dc6775b638c91b16',1,'stdex::watchdog']]] ]; diff --git a/search/functions_2.js b/search/functions_2.js index f6fea01e5..94c690a9e 100644 --- a/search/functions_2.js +++ b/search/functions_2.js @@ -1,9 +1,9 @@ var searchData= [ ['cached_5ffile_0',['cached_file',['../classstdex_1_1stream_1_1cached__file.html#aa53149a79b463450f64223f45285dc02',1,'stdex::stream::cached_file::cached_file(const schar_t *filename, int mode, size_t cache_size=default_cache_size)'],['../classstdex_1_1stream_1_1cached__file.html#ad788407862cb4e2b09de6067d906e293',1,'stdex::stream::cached_file::cached_file(const std::basic_string< TR, AX > &filename, int mode, size_t cache_size=default_cache_size)']]], - ['cancel_1',['cancel',['../classstdex_1_1progress.html#a03380c822297092b3bb9867deee26202',1,'stdex::progress::cancel()'],['../classstdex_1_1global__progress.html#a74a5ea9089ff7b7015ea4a2071f3113e',1,'stdex::global_progress::cancel()']]], + ['cancel_1',['cancel',['../classstdex_1_1progress.html#a03380c822297092b3bb9867deee26202',1,'stdex::progress::cancel()'],['../classstdex_1_1global__progress.html#a74a5ea9089ff7b7015ea4a2071f3113e',1,'stdex::global_progress::cancel()'],['../classstdex_1_1aggregate__progress_1_1worker__progress.html#a61defd3930ff3a62d56890c80f60086a',1,'stdex::aggregate_progress::worker_progress::cancel()']]], ['capacity_2',['capacity',['../classstdex_1_1vector__queue.html#add3d6ed93d3c1471b80351c56639bab7',1,'stdex::vector_queue']]], - ['clear_3',['clear',['../classstdex_1_1base64__enc.html#afb6a85176589d9ce1f65ce6355592fe7',1,'stdex::base64_enc::clear()'],['../classstdex_1_1base64__dec.html#a94738b63789489022e0c16063b732305',1,'stdex::base64_dec::clear()'],['../classstdex_1_1basic__hash.html#af5e2ff7b83da5a663fa3c9766734b771',1,'stdex::basic_hash::clear()'],['../classstdex_1_1block__hash.html#a8750f9c24cd22bd879dc638256534aec',1,'stdex::block_hash::clear()'],['../classstdex_1_1crc32__hash.html#addf745566fe5a1ba3f947a70603ea235',1,'stdex::crc32_hash::clear()'],['../classstdex_1_1md5__hash.html#a0952042043c10e184d9ee8a79421cc0f',1,'stdex::md5_hash::clear()'],['../classstdex_1_1sha1__hash.html#a36f38887f8e90f88df0a420f0011b9b3',1,'stdex::sha1_hash::clear()'],['../classstdex_1_1hex__dec.html#a282bf5db0d16b29b12c71b73d3a33cc4',1,'stdex::hex_dec::clear()'],['../classstdex_1_1html_1_1document.html#aecb7a14d12137d624dfe5378f27ab70c',1,'stdex::html::document::clear()'],['../classstdex_1_1vector__queue.html#a93259be5f471580d2f8d7bee41032f9b',1,'stdex::vector_queue::clear()']]], + ['clear_3',['clear',['../classstdex_1_1base64__enc.html#afb6a85176589d9ce1f65ce6355592fe7',1,'stdex::base64_enc::clear()'],['../classstdex_1_1base64__dec.html#a94738b63789489022e0c16063b732305',1,'stdex::base64_dec::clear()'],['../classstdex_1_1basic__hash.html#af5e2ff7b83da5a663fa3c9766734b771',1,'stdex::basic_hash::clear()'],['../classstdex_1_1block__hash.html#a8750f9c24cd22bd879dc638256534aec',1,'stdex::block_hash::clear()'],['../classstdex_1_1crc32__hash.html#addf745566fe5a1ba3f947a70603ea235',1,'stdex::crc32_hash::clear()'],['../classstdex_1_1md5__hash.html#a0952042043c10e184d9ee8a79421cc0f',1,'stdex::md5_hash::clear()'],['../classstdex_1_1sha1__hash.html#a36f38887f8e90f88df0a420f0011b9b3',1,'stdex::sha1_hash::clear()'],['../classstdex_1_1hex__dec.html#a282bf5db0d16b29b12c71b73d3a33cc4',1,'stdex::hex_dec::clear()'],['../classstdex_1_1html_1_1document.html#aecb7a14d12137d624dfe5378f27ab70c',1,'stdex::html::document::clear()'],['../classstdex_1_1pool.html#a96acba9575913aa2c1a4179f84673c77',1,'stdex::pool::clear()'],['../classstdex_1_1vector__queue.html#a93259be5f471580d2f8d7bee41032f9b',1,'stdex::vector_queue::clear()']]], ['close_4',['close',['../classstdex_1_1idrec_1_1record.html#a9fb4bee3afca4803a36767e3181a35b9',1,'stdex::idrec::record::close(std::ostream &stream, std::streamoff start)'],['../classstdex_1_1idrec_1_1record.html#a73697f4572d009b34c9a9ba66993391a',1,'stdex::idrec::record::close(stdex::stream::basic_file &stream, stdex::stream::foff_t start)'],['../classstdex_1_1stream_1_1basic.html#a5392748c19b5799da94a5fe031f7ec3b',1,'stdex::stream::basic::close()'],['../classstdex_1_1stream_1_1converter.html#a96c368204acf32239318a026762cd22c',1,'stdex::stream::converter::close()'],['../classstdex_1_1stream_1_1replicator.html#afa3e2cec6e254e7bb53cc5e1b1ea0f90',1,'stdex::stream::replicator::close()'],['../classstdex_1_1stream_1_1file__window.html#acace60a7ba95a139852f85aa4232bb14',1,'stdex::stream::file_window::close()'],['../classstdex_1_1stream_1_1cache.html#aa88074bb669bcb654e027b76e32a2799',1,'stdex::stream::cache::close()'],['../classstdex_1_1stream_1_1basic__sys.html#aee56fbeb8b576a4337cb205ae865fafc',1,'stdex::stream::basic_sys::close()'],['../classstdex_1_1stream_1_1socket.html#a74e2f261c117cf8f20866632fb79b3c5',1,'stdex::stream::socket::close()'],['../classstdex_1_1stream_1_1memory__file.html#a4cf33faaf1686335bd3e3a7e72813dd6',1,'stdex::stream::memory_file::close()'],['../classstdex_1_1stream_1_1fifo.html#a29e0a95836f4e2692bea3783acaf692d',1,'stdex::stream::fifo::close()'],['../classstdex_1_1stream_1_1diag__file.html#a4367a6d2840c1a2c5d9ab2ab3483ed2c',1,'stdex::stream::diag_file::close()'],['../classstdex_1_1sys__object.html#ab8c0119bc4958f78f51ef2f3b7c91f66',1,'stdex::sys_object::close()'],['../classstdex_1_1sys__object.html#acbb82c6c1fce7ee39518f94b1209b0b8',1,'stdex::sys_object::close(sys_handle h)']]], ['contains_5',['contains',['../structstdex_1_1interval.html#a1624ca77e8c9cb45cef61f7f8b532222',1,'stdex::interval']]], ['convert_6',['convert',['../classstdex_1_1charset__encoder.html#acf89b5fd8a42786a2f94edcff24364c6',1,'stdex::charset_encoder::convert(_In_reads_or_z_opt_(count_src) const T_from *src, size_t count_src)'],['../classstdex_1_1charset__encoder.html#a80f781d783dde0261fe272e193a3d03a',1,'stdex::charset_encoder::convert(const T_from *src)'],['../classstdex_1_1charset__encoder.html#ab8fc27f43dceed7530ae9ee05c2b2ebc',1,'stdex::charset_encoder::convert(const std::basic_string_view< T_from, std::char_traits< T_from > > src)']]], diff --git a/search/functions_3.js b/search/functions_3.js index 0bbe8137b..d34a948c0 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -4,7 +4,7 @@ var searchData= ['day_5fof_5fweek_1',['day_of_week',['../structstdex_1_1chrono_1_1aosn__date.html#a22273e1d536ed78a67beef7be5d0ebd6',1,'stdex::chrono::aosn_date::day_of_week(const time_point tp)'],['../structstdex_1_1chrono_1_1aosn__date.html#a27f6f9c4f44d9f874b9edb868afa264d',1,'stdex::chrono::aosn_date::day_of_week(uint8_t day, uint8_t month, int32_t year)']]], ['dec_5fsize_2',['dec_size',['../classstdex_1_1base64__dec.html#a203f2afa5839242c1230cb22e0a65b25',1,'stdex::base64_dec::dec_size()'],['../classstdex_1_1hex__dec.html#acf3d5adf4766056a630d1ceeab946b55',1,'stdex::hex_dec::dec_size()']]], ['decode_3',['decode',['../classstdex_1_1base64__dec.html#a94b0860b19c61f53208b79fcfd1ac32f',1,'stdex::base64_dec::decode(std::vector< T_to, AX > &out, bool &is_last, const T_from *data, size_t size)'],['../classstdex_1_1base64__dec.html#a07976a85f83981a29f9e1395d883a36d',1,'stdex::base64_dec::decode(std::vector< T, AX > &out)'],['../classstdex_1_1base64__reader.html#a523ece0190b031882162c7e4edd33fbb',1,'stdex::base64_reader::decode()'],['../classstdex_1_1hex__dec.html#a860e727d082f427ea6b434489c77f813',1,'stdex::hex_dec::decode()']]], - ['detach_4',['detach',['../classstdex_1_1global__progress.html#aa2c5391aa2f1f30e72a700768bc52f84',1,'stdex::global_progress']]], + ['detach_4',['detach',['../classstdex_1_1global__progress.html#aa2c5391aa2f1f30e72a700768bc52f84',1,'stdex::global_progress::detach()'],['../classstdex_1_1aggregate__progress.html#acec6e7132735143aaee405948821803f',1,'stdex::aggregate_progress::detach()']]], ['do_5fmatch_5',['do_match',['../classstdex_1_1parser_1_1basic__html__declaration__condition__start.html#a53c2c4bc6c7dbd88d79e2848607fb138',1,'stdex::parser::basic_html_declaration_condition_start']]], ['do_5fset_6',['do_set',['../classstdex_1_1lazy__progress.html#ad0242cb4f3ece8aacfaab8804e7c646e',1,'stdex::lazy_progress']]], ['duplicate_7',['duplicate',['../classstdex_1_1sys__object.html#abf438fb703eeed47147841b07b44d46d',1,'stdex::sys_object']]] diff --git a/search/functions_6.js b/search/functions_6.js index 8afd0209b..c457f681d 100644 --- a/search/functions_6.js +++ b/search/functions_6.js @@ -1,5 +1,5 @@ var searchData= [ ['get_0',['get',['../classstdex_1_1stream_1_1socket.html#a48f512c2f87d27c40d630ecbd9837d3c',1,'stdex::stream::socket::get()'],['../classstdex_1_1stream_1_1memory__file.html#a41124fc38a3439c4407ea1c9ef4962b1',1,'stdex::stream::memory_file::get()'],['../classstdex_1_1sys__object.html#a68edd83d50aee1dd85645aa0506c8769',1,'stdex::sys_object::get()']]], - ['global_5fprogress_1',['global_progress',['../classstdex_1_1global__progress.html#a0ffa6fafa04588c0df06d077ae51d037',1,'stdex::global_progress']]] + ['global_5fprogress_1',['global_progress',['../classstdex_1_1global__progress.html#ad65b4efb79010d917ea66b1acf455560',1,'stdex::global_progress']]] ]; diff --git a/search/functions_c.js b/search/functions_c.js index 4500d39ca..96049af8f 100644 --- a/search/functions_c.js +++ b/search/functions_c.js @@ -12,5 +12,5 @@ var searchData= ['operator_2d_2d_9',['operator--',['../structstdex_1_1interval.html#aaaad66838ffc6fe5e141118d2e7aa3e9',1,'stdex::interval::operator--()'],['../structstdex_1_1interval.html#ae30e97caad1f0a0a81ec9fd5f183b6ba',1,'stdex::interval::operator--(int)']]], ['operator_3d_10',['operator=',['../classstdex_1_1idrec_1_1record.html#a07934d315566b6ad40edbc5f93cb5978',1,'stdex::idrec::record::operator=()'],['../classstdex_1_1stream_1_1memory__file.html#a8864aed603e57ceb982956ce05da8b68',1,'stdex::stream::memory_file::operator=(const memory_file &other)'],['../classstdex_1_1stream_1_1memory__file.html#a053bad774ae0343bcc5d05b5108a5a90',1,'stdex::stream::memory_file::operator=(memory_file &&other) noexcept'],['../classstdex_1_1vector__queue.html#a00e42f0b6c31aa16e47a1093e90fd1aa',1,'stdex::vector_queue::operator=(const vector_queue< value_type > &other)'],['../classstdex_1_1vector__queue.html#a840d69192e880fcce588c6368a7d1bab',1,'stdex::vector_queue::operator=(vector_queue< value_type > &&other)']]], ['operator_3d_3d_11',['operator==',['../structstdex_1_1interval.html#a9da38b025dbd14ebded9fd06720a2345',1,'stdex::interval::operator==()'],['../structstdex_1_1mapping.html#a6d9fa746849e2ea27f53e40b8b44fb46',1,'stdex::mapping::operator==()']]], - ['operator_5b_5d_12',['operator[]',['../classstdex_1_1vector__queue.html#a21497b5396ef80a2d641f8ee767a3b17',1,'stdex::vector_queue::operator[](size_type pos)'],['../classstdex_1_1vector__queue.html#ace07c52caf736c3285909d64b22a2c4c',1,'stdex::vector_queue::operator[](size_type pos) const']]] + ['operator_5b_5d_12',['operator[]',['../classstdex_1_1aggregate__progress.html#a431650892bd6133b6c781cf33b1a5d24',1,'stdex::aggregate_progress::operator[]()'],['../classstdex_1_1vector__queue.html#a21497b5396ef80a2d641f8ee767a3b17',1,'stdex::vector_queue::operator[](size_type pos)'],['../classstdex_1_1vector__queue.html#ace07c52caf736c3285909d64b22a2c4c',1,'stdex::vector_queue::operator[](size_type pos) const']]] ]; diff --git a/sgml_8cpp_source.html b/sgml_8cpp_source.html index ee4c9950e..4d48c1073 100644 --- a/sgml_8cpp_source.html +++ b/sgml_8cpp_source.html @@ -155,7 +155,7 @@ $(function() { codefold.init(0); });
    diff --git a/sgml_8hpp_source.html b/sgml_8hpp_source.html index 16b25e5ee..7205b8a7b 100644 --- a/sgml_8hpp_source.html +++ b/sgml_8hpp_source.html @@ -779,7 +779,7 @@ $(function() { codefold.init(0); });
    diff --git a/sgml__unicode_8hpp_source.html b/sgml__unicode_8hpp_source.html index 69f8a64cc..0448cca11 100644 --- a/sgml__unicode_8hpp_source.html +++ b/sgml__unicode_8hpp_source.html @@ -3177,7 +3177,7 @@ $(function() { codefold.init(0); });
    diff --git a/socket_8hpp_source.html b/socket_8hpp_source.html index 6fe7f6c8a..ff5fc4c0c 100644 --- a/socket_8hpp_source.html +++ b/socket_8hpp_source.html @@ -115,7 +115,7 @@ $(function() { codefold.init(0); });
    diff --git a/spinlock_8hpp_source.html b/spinlock_8hpp_source.html index 88ebe598d..6b5cf6385 100644 --- a/spinlock_8hpp_source.html +++ b/spinlock_8hpp_source.html @@ -159,7 +159,7 @@ $(function() { codefold.init(0); });
    diff --git a/stream_8cpp_source.html b/stream_8cpp_source.html index b4dd8740b..5346d384f 100644 --- a/stream_8cpp_source.html +++ b/stream_8cpp_source.html @@ -259,7 +259,7 @@ $(function() { codefold.init(0); });
    diff --git a/stream_8hpp_source.html b/stream_8hpp_source.html index b065a2fcd..88afa73d3 100644 --- a/stream_8hpp_source.html +++ b/stream_8hpp_source.html @@ -4345,7 +4345,7 @@ $(function() { codefold.init(0); });
    diff --git a/string_8hpp_source.html b/string_8hpp_source.html index 2e078cdbd..f079ce55e 100644 --- a/string_8hpp_source.html +++ b/string_8hpp_source.html @@ -1979,7 +1979,7 @@ $(function() { codefold.init(0); });
    diff --git a/structstdex_1_1chrono_1_1aosn__date-members.html b/structstdex_1_1chrono_1_1aosn__date-members.html index df1ccf1f7..2b73e346a 100644 --- a/structstdex_1_1chrono_1_1aosn__date-members.html +++ b/structstdex_1_1chrono_1_1aosn__date-members.html @@ -98,7 +98,7 @@ $(function() {
    diff --git a/structstdex_1_1chrono_1_1aosn__date.html b/structstdex_1_1chrono_1_1aosn__date.html index a83dfda53..52b4f16d0 100644 --- a/structstdex_1_1chrono_1_1aosn__date.html +++ b/structstdex_1_1chrono_1_1aosn__date.html @@ -154,7 +154,7 @@ static constexpr bool is_s
    diff --git a/structstdex_1_1chrono_1_1aosn__timestamp-members.html b/structstdex_1_1chrono_1_1aosn__timestamp-members.html index 8f1695228..2f189830b 100644 --- a/structstdex_1_1chrono_1_1aosn__timestamp-members.html +++ b/structstdex_1_1chrono_1_1aosn__timestamp-members.html @@ -112,7 +112,7 @@ $(function() {
    diff --git a/structstdex_1_1chrono_1_1aosn__timestamp.html b/structstdex_1_1chrono_1_1aosn__timestamp.html index a53975040..2dec4eafa 100644 --- a/structstdex_1_1chrono_1_1aosn__timestamp.html +++ b/structstdex_1_1chrono_1_1aosn__timestamp.html @@ -199,7 +199,7 @@ static constexpr rep one_w
    diff --git a/structstdex_1_1free__locale__delete-members.html b/structstdex_1_1free__locale__delete-members.html index 1f883e691..70fadf1f5 100644 --- a/structstdex_1_1free__locale__delete-members.html +++ b/structstdex_1_1free__locale__delete-members.html @@ -86,7 +86,7 @@ $(function() {
    diff --git a/structstdex_1_1free__locale__delete.html b/structstdex_1_1free__locale__delete.html index efdd84013..db242873c 100644 --- a/structstdex_1_1free__locale__delete.html +++ b/structstdex_1_1free__locale__delete.html @@ -103,7 +103,7 @@ void operator() (local
    diff --git a/structstdex_1_1html_1_1element__traits-members.html b/structstdex_1_1html_1_1element__traits-members.html index ff323fc46..37530c8cb 100644 --- a/structstdex_1_1html_1_1element__traits-members.html +++ b/structstdex_1_1html_1_1element__traits-members.html @@ -104,7 +104,7 @@ $(function() {
    diff --git a/structstdex_1_1html_1_1element__traits.html b/structstdex_1_1html_1_1element__traits.html index 97954d39d..dfbca6ac7 100644 --- a/structstdex_1_1html_1_1element__traits.html +++ b/structstdex_1_1html_1_1element__traits.html @@ -821,7 +821,7 @@ template<class T >
    diff --git a/structstdex_1_1html_1_1entity-members.html b/structstdex_1_1html_1_1entity-members.html index 34cd6c1a9..844df6fa7 100644 --- a/structstdex_1_1html_1_1entity-members.html +++ b/structstdex_1_1html_1_1entity-members.html @@ -87,7 +87,7 @@ $(function() {
    diff --git a/structstdex_1_1html_1_1entity.html b/structstdex_1_1html_1_1entity.html index 7d0d2caac..bef7db0c0 100644 --- a/structstdex_1_1html_1_1entity.html +++ b/structstdex_1_1html_1_1entity.html @@ -108,7 +108,7 @@ struct stdex::html::entity< T, TR, AX >

    HTML entity.

    diff --git a/structstdex_1_1html_1_1inserted__token-members.html b/structstdex_1_1html_1_1inserted__token-members.html index 0c7fb9dbe..745d846f6 100644 --- a/structstdex_1_1html_1_1inserted__token-members.html +++ b/structstdex_1_1html_1_1inserted__token-members.html @@ -89,7 +89,7 @@ $(function() {
    diff --git a/structstdex_1_1html_1_1inserted__token.html b/structstdex_1_1html_1_1inserted__token.html index 7a2ef72cd..0d92aff3b 100644 --- a/structstdex_1_1html_1_1inserted__token.html +++ b/structstdex_1_1html_1_1inserted__token.html @@ -115,7 +115,7 @@ bool after_word diff --git a/structstdex_1_1interval-members.html b/structstdex_1_1interval-members.html index 623254de8..6540bbc8a 100644 --- a/structstdex_1_1interval-members.html +++ b/structstdex_1_1interval-members.html @@ -105,7 +105,7 @@ $(function() {
    diff --git a/structstdex_1_1interval.html b/structstdex_1_1interval.html index 1289c29dd..f51562f4d 100644 --- a/structstdex_1_1interval.html +++ b/structstdex_1_1interval.html @@ -707,7 +707,7 @@ template<class T >
    diff --git a/structstdex_1_1mapping-members.html b/structstdex_1_1mapping-members.html index e7f15ab7f..d4265bf35 100644 --- a/structstdex_1_1mapping-members.html +++ b/structstdex_1_1mapping-members.html @@ -92,7 +92,7 @@ $(function() {
    diff --git a/structstdex_1_1mapping.html b/structstdex_1_1mapping.html index 0234d4f4e..ec2d60979 100644 --- a/structstdex_1_1mapping.html +++ b/structstdex_1_1mapping.html @@ -275,7 +275,7 @@ template<class T >
    diff --git a/structstdex_1_1no__delete-members.html b/structstdex_1_1no__delete-members.html index 1a2a56182..775543cdd 100644 --- a/structstdex_1_1no__delete-members.html +++ b/structstdex_1_1no__delete-members.html @@ -88,7 +88,7 @@ $(function() {
    diff --git a/structstdex_1_1no__delete.html b/structstdex_1_1no__delete.html index 469eb5f96..b2d0fbefc 100644 --- a/structstdex_1_1no__delete.html +++ b/structstdex_1_1no__delete.html @@ -107,7 +107,7 @@ struct stdex::no_delete< T >

    Noop deleter.

    diff --git a/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html b/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html index 8542f67c9..c44587680 100644 --- a/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html +++ b/structstdex_1_1no__delete_3_01_t_0f_0e_4-members.html @@ -88,7 +88,7 @@ $(function() {
    diff --git a/structstdex_1_1no__delete_3_01_t_0f_0e_4.html b/structstdex_1_1no__delete_3_01_t_0f_0e_4.html index 05a0f87ed..345a479a2 100644 --- a/structstdex_1_1no__delete_3_01_t_0f_0e_4.html +++ b/structstdex_1_1no__delete_3_01_t_0f_0e_4.html @@ -108,7 +108,7 @@ struct stdex::no_delete< T[]>

    Noop array deleter.

    diff --git a/structstdex_1_1parser_1_1html__attribute-members.html b/structstdex_1_1parser_1_1html__attribute-members.html index 09e8b6066..eaeeca621 100644 --- a/structstdex_1_1parser_1_1html__attribute-members.html +++ b/structstdex_1_1parser_1_1html__attribute-members.html @@ -87,7 +87,7 @@ $(function() {
    diff --git a/structstdex_1_1parser_1_1html__attribute.html b/structstdex_1_1parser_1_1html__attribute.html index 0b3e0be18..dee100ce7 100644 --- a/structstdex_1_1parser_1_1html__attribute.html +++ b/structstdex_1_1parser_1_1html__attribute.html @@ -107,7 +107,7 @@ Public Attributes
    diff --git a/structstdex_1_1parser_1_1http__factor__more-members.html b/structstdex_1_1parser_1_1http__factor__more-members.html index c36598c30..31933b53b 100644 --- a/structstdex_1_1parser_1_1http__factor__more-members.html +++ b/structstdex_1_1parser_1_1http__factor__more-members.html @@ -86,7 +86,7 @@ $(function() {
    diff --git a/structstdex_1_1parser_1_1http__factor__more.html b/structstdex_1_1parser_1_1http__factor__more.html index 9bc58c88e..f85d588a4 100644 --- a/structstdex_1_1parser_1_1http__factor__more.html +++ b/structstdex_1_1parser_1_1http__factor__more.html @@ -95,7 +95,7 @@ Public Member Functions
    diff --git a/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html b/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html index 25fbb0bf3..0e3ddcae8 100644 --- a/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html +++ b/structstdex_1_1stream_1_1buffer_1_1buffer__t-members.html @@ -91,7 +91,7 @@ $(function() {
    diff --git a/structstdex_1_1stream_1_1buffer_1_1buffer__t.html b/structstdex_1_1stream_1_1buffer_1_1buffer__t.html index 3b98f5d23..3df085f85 100644 --- a/structstdex_1_1stream_1_1buffer_1_1buffer__t.html +++ b/structstdex_1_1stream_1_1buffer_1_1buffer__t.html @@ -111,7 +111,7 @@ size_t capacity diff --git a/structstdex_1_1stream_1_1fifo_1_1node__t-members.html b/structstdex_1_1stream_1_1fifo_1_1node__t-members.html index d82751366..4c5905166 100644 --- a/structstdex_1_1stream_1_1fifo_1_1node__t-members.html +++ b/structstdex_1_1stream_1_1fifo_1_1node__t-members.html @@ -88,7 +88,7 @@ $(function() {
    diff --git a/structstdex_1_1stream_1_1fifo_1_1node__t.html b/structstdex_1_1stream_1_1fifo_1_1node__t.html index d262ccdb0..eab53752d 100644 --- a/structstdex_1_1stream_1_1fifo_1_1node__t.html +++ b/structstdex_1_1stream_1_1fifo_1_1node__t.html @@ -101,7 +101,7 @@ uint8_t data [0]<
    diff --git a/structstdex_1_1sys__info__t-members.html b/structstdex_1_1sys__info__t-members.html index fb0f893cc..6f40add87 100644 --- a/structstdex_1_1sys__info__t-members.html +++ b/structstdex_1_1sys__info__t-members.html @@ -92,7 +92,7 @@ $(function() {
    diff --git a/structstdex_1_1sys__info__t.html b/structstdex_1_1sys__info__t.html index 12b8cfe1e..26467922c 100644 --- a/structstdex_1_1sys__info__t.html +++ b/structstdex_1_1sys__info__t.html @@ -147,7 +147,7 @@ struct utsname m_utsn<
    diff --git a/structstdex_1_1wav_1_1cue-members.html b/structstdex_1_1wav_1_1cue-members.html index 1e49d6336..f2b2432aa 100644 --- a/structstdex_1_1wav_1_1cue-members.html +++ b/structstdex_1_1wav_1_1cue-members.html @@ -91,7 +91,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1cue.html b/structstdex_1_1wav_1_1cue.html index 91d047dd7..119af3ba6 100644 --- a/structstdex_1_1wav_1_1cue.html +++ b/structstdex_1_1wav_1_1cue.html @@ -132,7 +132,7 @@ uint32_t block_offset
    diff --git a/structstdex_1_1wav_1_1cue__ex-members.html b/structstdex_1_1wav_1_1cue__ex-members.html index 9126a5c51..51c98a26c 100644 --- a/structstdex_1_1wav_1_1cue__ex-members.html +++ b/structstdex_1_1wav_1_1cue__ex-members.html @@ -100,7 +100,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1cue__ex.html b/structstdex_1_1wav_1_1cue__ex.html index 4aa4e7295..d30585836 100644 --- a/structstdex_1_1wav_1_1cue__ex.html +++ b/structstdex_1_1wav_1_1cue__ex.html @@ -169,7 +169,7 @@ uint32_t block_offset
    diff --git a/structstdex_1_1wav_1_1data-members.html b/structstdex_1_1wav_1_1data-members.html index f092fa894..bcc83921b 100644 --- a/structstdex_1_1wav_1_1data-members.html +++ b/structstdex_1_1wav_1_1data-members.html @@ -89,7 +89,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1data.html b/structstdex_1_1wav_1_1data.html index fdebb9ae2..5de8e1e9a 100644 --- a/structstdex_1_1wav_1_1data.html +++ b/structstdex_1_1wav_1_1data.html @@ -120,7 +120,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1format-members.html b/structstdex_1_1wav_1_1format-members.html index a5b00e050..2629c2dcc 100644 --- a/structstdex_1_1wav_1_1format-members.html +++ b/structstdex_1_1wav_1_1format-members.html @@ -96,7 +96,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1format.html b/structstdex_1_1wav_1_1format.html index 7ecaa5af5..21a452481 100644 --- a/structstdex_1_1wav_1_1format.html +++ b/structstdex_1_1wav_1_1format.html @@ -211,7 +211,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1header-members.html b/structstdex_1_1wav_1_1header-members.html index 3b5c312b0..2eb653567 100644 --- a/structstdex_1_1wav_1_1header-members.html +++ b/structstdex_1_1wav_1_1header-members.html @@ -89,7 +89,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1header.html b/structstdex_1_1wav_1_1header.html index 56a1e109b..1c426fc09 100644 --- a/structstdex_1_1wav_1_1header.html +++ b/structstdex_1_1wav_1_1header.html @@ -130,7 +130,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1label-members.html b/structstdex_1_1wav_1_1label-members.html index a9d7aac62..048ccd2d2 100644 --- a/structstdex_1_1wav_1_1label-members.html +++ b/structstdex_1_1wav_1_1label-members.html @@ -90,7 +90,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1label.html b/structstdex_1_1wav_1_1label.html index 5fefe567a..7c2acf541 100644 --- a/structstdex_1_1wav_1_1label.html +++ b/structstdex_1_1wav_1_1label.html @@ -124,7 +124,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1list-members.html b/structstdex_1_1wav_1_1list-members.html index d8659675d..d0a2744a1 100644 --- a/structstdex_1_1wav_1_1list-members.html +++ b/structstdex_1_1wav_1_1list-members.html @@ -87,7 +87,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1list.html b/structstdex_1_1wav_1_1list.html index ac28e434f..7a2679832 100644 --- a/structstdex_1_1wav_1_1list.html +++ b/structstdex_1_1wav_1_1list.html @@ -123,7 +123,7 @@ id_t type = 0 diff --git a/structstdex_1_1wav_1_1ltxt-members.html b/structstdex_1_1wav_1_1ltxt-members.html index 89efca552..8df72f462 100644 --- a/structstdex_1_1wav_1_1ltxt-members.html +++ b/structstdex_1_1wav_1_1ltxt-members.html @@ -96,7 +96,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1ltxt.html b/structstdex_1_1wav_1_1ltxt.html index 7893e89c9..57ce67d49 100644 --- a/structstdex_1_1wav_1_1ltxt.html +++ b/structstdex_1_1wav_1_1ltxt.html @@ -148,7 +148,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1note-members.html b/structstdex_1_1wav_1_1note-members.html index b606d7eb9..382d66d4c 100644 --- a/structstdex_1_1wav_1_1note-members.html +++ b/structstdex_1_1wav_1_1note-members.html @@ -90,7 +90,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1note.html b/structstdex_1_1wav_1_1note.html index 8ef7cf2e5..485902119 100644 --- a/structstdex_1_1wav_1_1note.html +++ b/structstdex_1_1wav_1_1note.html @@ -124,7 +124,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1silence-members.html b/structstdex_1_1wav_1_1silence-members.html index 2e7a94bbb..aa469a1cc 100644 --- a/structstdex_1_1wav_1_1silence-members.html +++ b/structstdex_1_1wav_1_1silence-members.html @@ -89,7 +89,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1silence.html b/structstdex_1_1wav_1_1silence.html index 4eb8eea8c..139116db4 100644 --- a/structstdex_1_1wav_1_1silence.html +++ b/structstdex_1_1wav_1_1silence.html @@ -120,7 +120,7 @@ Friends
    diff --git a/structstdex_1_1wav_1_1wave-members.html b/structstdex_1_1wav_1_1wave-members.html index 8031c42cf..5d1b9061f 100644 --- a/structstdex_1_1wav_1_1wave-members.html +++ b/structstdex_1_1wav_1_1wave-members.html @@ -87,7 +87,7 @@ $(function() {
    diff --git a/structstdex_1_1wav_1_1wave.html b/structstdex_1_1wav_1_1wave.html index 9b439f2ac..800b92837 100644 --- a/structstdex_1_1wav_1_1wave.html +++ b/structstdex_1_1wav_1_1wave.html @@ -123,7 +123,7 @@ id_t type = 0 diff --git a/sys__info_8hpp_source.html b/sys__info_8hpp_source.html index b4fcc3a55..b37c2728d 100644 --- a/sys__info_8hpp_source.html +++ b/sys__info_8hpp_source.html @@ -300,7 +300,7 @@ $(function() { codefold.init(0); });
    diff --git a/system_8hpp_source.html b/system_8hpp_source.html index 25c314f5c..e4b257ccf 100644 --- a/system_8hpp_source.html +++ b/system_8hpp_source.html @@ -294,7 +294,7 @@ $(function() { codefold.init(0); });
    diff --git a/unicode_8cpp_source.html b/unicode_8cpp_source.html index 96b4b198b..e42e299ed 100644 --- a/unicode_8cpp_source.html +++ b/unicode_8cpp_source.html @@ -195,7 +195,7 @@ $(function() { codefold.init(0); });
    diff --git a/unicode_8hpp_source.html b/unicode_8hpp_source.html index 4a37683ae..c50fe2eaa 100644 --- a/unicode_8hpp_source.html +++ b/unicode_8hpp_source.html @@ -817,7 +817,7 @@ $(function() { codefold.init(0); });
    diff --git a/unionstdex_1_1md2__t-members.html b/unionstdex_1_1md2__t-members.html index b7a236e7a..cae9b22a3 100644 --- a/unionstdex_1_1md2__t-members.html +++ b/unionstdex_1_1md2__t-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/unionstdex_1_1md2__t.html b/unionstdex_1_1md2__t.html index dbadb2ef0..b917a9a15 100644 --- a/unionstdex_1_1md2__t.html +++ b/unionstdex_1_1md2__t.html @@ -125,7 +125,7 @@ Friends diff --git a/unionstdex_1_1sha256__t-members.html b/unionstdex_1_1sha256__t-members.html index 6fec38556..b82977546 100644 --- a/unionstdex_1_1sha256__t-members.html +++ b/unionstdex_1_1sha256__t-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/unionstdex_1_1sha256__t.html b/unionstdex_1_1sha256__t.html index b2660bdba..1d1c3f00b 100644 --- a/unionstdex_1_1sha256__t.html +++ b/unionstdex_1_1sha256__t.html @@ -125,7 +125,7 @@ Friends diff --git a/unionstdex_1_1sha__t-members.html b/unionstdex_1_1sha__t-members.html index 2093cf04e..67128ffc3 100644 --- a/unionstdex_1_1sha__t-members.html +++ b/unionstdex_1_1sha__t-members.html @@ -91,7 +91,7 @@ $(function() { diff --git a/unionstdex_1_1sha__t.html b/unionstdex_1_1sha__t.html index 5e5ce9486..dd76d4b93 100644 --- a/unionstdex_1_1sha__t.html +++ b/unionstdex_1_1sha__t.html @@ -125,7 +125,7 @@ Friends diff --git a/uuid_8hpp_source.html b/uuid_8hpp_source.html index 2f8d3dfe1..f6cb371ea 100644 --- a/uuid_8hpp_source.html +++ b/uuid_8hpp_source.html @@ -147,7 +147,7 @@ $(function() { codefold.init(0); }); diff --git a/vector__queue_8hpp_source.html b/vector__queue_8hpp_source.html index 66bfd4747..da9208b2f 100644 --- a/vector__queue_8hpp_source.html +++ b/vector__queue_8hpp_source.html @@ -454,7 +454,7 @@ $(function() { codefold.init(0); }); diff --git a/watchdog_8cpp_source.html b/watchdog_8cpp_source.html index c5fe004ea..eea4e8ebc 100644 --- a/watchdog_8cpp_source.html +++ b/watchdog_8cpp_source.html @@ -120,7 +120,7 @@ $(function() { codefold.init(0); }); diff --git a/watchdog_8hpp_source.html b/watchdog_8hpp_source.html index c78718cb4..1241952e6 100644 --- a/watchdog_8hpp_source.html +++ b/watchdog_8hpp_source.html @@ -142,43 +142,53 @@ $(function() { codefold.init(0); });
    66 protected:
    67 void run()
    68 {
    -
    69 for (;;) {
    -
    70 std::unique_lock<std::mutex> lk(m_mutex);
    -
    71 auto phase = m_phase;
    -
    72 if (m_cv.wait_for(lk, m_timeout, [&] {return m_quit || phase != m_phase; })) {
    -
    73 if (m_quit)
    -
    74 break;
    -
    75 }
    -
    76 else {
    -
    77 m_callback();
    -
    78 break;
    -
    79 }
    -
    80 }
    -
    81 }
    -
    82
    -
    83 protected:
    -
    84 size_t m_phase;
    -
    85 bool m_quit;
    -
    86 _Duration m_timeout;
    -
    87 std::function<void()> m_callback;
    -
    88 std::mutex m_mutex;
    -
    89 std::condition_variable m_cv;
    -
    90 std::thread m_thread;
    -
    91 };
    +
    69 size_t phase;
    +
    70 for (;;) {
    +
    71 {
    +
    72 std::unique_lock<std::mutex> lk(m_mutex);
    +
    73 phase = m_phase;
    +
    74 if (m_cv.wait_for(lk, m_timeout, [&] {return m_quit || phase != m_phase; })) {
    +
    75 if (m_quit)
    +
    76 break;
    +
    77 // reset() called in time.
    +
    78 continue;
    +
    79 }
    +
    80 }
    +
    81 // Timeout
    +
    82 m_callback();
    +
    83 {
    +
    84 // Sleep until next reset().
    +
    85 std::unique_lock<std::mutex> lk(m_mutex);
    +
    86 m_cv.wait(lk, [&] {return m_quit || phase != m_phase; });
    +
    87 if (m_quit)
    +
    88 break;
    +
    89 }
    +
    90 }
    +
    91 }
    +
    92
    +
    93 protected:
    +
    94 size_t m_phase;
    +
    95 bool m_quit;
    +
    96 _Duration m_timeout;
    +
    97 std::function<void()> m_callback;
    +
    98 std::mutex m_mutex;
    +
    99 std::condition_variable m_cv;
    +
    100 std::thread m_thread;
    +
    101 };
    -
    92}
    +
    102}
    Triggers callback if not reset frequently enough.
    Definition watchdog.hpp:22
    watchdog(_Duration timeout, std::function< void()> callback)
    Starts the watchdog.
    Definition watchdog.hpp:30
    -
    size_t m_phase
    A counter we are incrementing to keep the watchdog happy.
    Definition watchdog.hpp:84
    -
    _Duration m_timeout
    How long the watchdog is waiting for a reset.
    Definition watchdog.hpp:86
    +
    size_t m_phase
    A counter we are incrementing to keep the watchdog happy.
    Definition watchdog.hpp:94
    +
    _Duration m_timeout
    How long the watchdog is waiting for a reset.
    Definition watchdog.hpp:96
    ~watchdog()
    Stops the watchdog.
    Definition watchdog.hpp:41
    -
    bool m_quit
    Quit the watchdog.
    Definition watchdog.hpp:85
    +
    bool m_quit
    Quit the watchdog.
    Definition watchdog.hpp:95
    void reset()
    Resets the watchdog.
    Definition watchdog.hpp:57
    -
    std::function< void()> m_callback
    The function watchdog calls on timeout.
    Definition watchdog.hpp:87
    +
    std::function< void()> m_callback
    The function watchdog calls on timeout.
    Definition watchdog.hpp:97
    diff --git a/wav_8hpp_source.html b/wav_8hpp_source.html index 1909ff7b9..3fd7f729f 100644 --- a/wav_8hpp_source.html +++ b/wav_8hpp_source.html @@ -789,7 +789,7 @@ $(function() { codefold.init(0); }); diff --git a/windows_8h_source.html b/windows_8h_source.html index f12b19b11..fa97997e9 100644 --- a/windows_8h_source.html +++ b/windows_8h_source.html @@ -111,7 +111,7 @@ $(function() { codefold.init(0); }); diff --git a/zlib_8hpp_source.html b/zlib_8hpp_source.html index 7a4465c27..011ff056b 100644 --- a/zlib_8hpp_source.html +++ b/zlib_8hpp_source.html @@ -266,7 +266,7 @@ $(function() { codefold.init(0); });