DriveHQ Start Menu
Cloud Drive Mapping
Folder Sync
Cloud Backup
True Drop Box
FTP/SFTP Hosting
Group Account
DriveHQ Start Menu
Online File Server
My Storage
|
Manage Shares
|
Publishes
|
Drop Boxes
|
Group Account
WebDAV Drive Mapping
Cloud Drive Home
|
WebDAV Guide
|
Drive Mapping Tool
|
Drive Mapping URL
Complete Data Backup
Backup Guide
|
Online Backup Tool
|
Cloud-to-Cloud Backup
FTP, Email & Web Service
FTP Home
|
FTP Hosting FAQ
|
Email Hosting
|
EmailManager
|
Web Hosting
Help & Resources
About
|
Enterprise Service
|
Partnership
|
Comparisons
|
Support
Quick Links
Security and Privacy
Download Software
Service Manual
Use Cases
Group Account
Online Help
Blog
Contact
Cloud Surveillance
Sign Up
Login
Features
Business Features
Online File Server
FTP Hosting
Cloud Drive Mapping
Cloud File Backup
Email Backup & Hosting
Cloud File Sharing
Folder Synchronization
Group Management
True Drop Box
Full-text Search
AD Integration/SSO
Mobile Access
IP Camera & DVR Solution
More...
Personal Features
Personal Cloud Drive
Backup All Devices
Mobile APPs
Personal Web Hosting
Sub-Account (for Kids)
Home/PC/Kids Monitoring
More...
Software
DriveHQ Drive Mapping Tool
DriveHQ FileManager
DriveHQ Online Backup
DriveHQ Mobile Apps
Pricing
Business Plans & Pricing
Personal Plans & Pricing
Price Comparison with Others
Feature Comparison with Others
Install Mobile App
Sign up
Creating account...
Invalid character in username! Only 0-9, a-z, A-Z, _, -, . allowed.
Username is required!
Invalid email address!
E-mail is required!
Password is required!
Password is invalid!
Password and confirmation do not match.
Confirm password is required!
I accept
Membership Agreement
Please read the Membership Agreement and check "I accept"!
Free Quick Sign-up
Sign-up Page
Log in
Signing in...
Username or e-mail address is required!
Password is required!
Keep me logged in
Quick Login
Forgot Password
Up
Upload
Download
Share
Publish
New Folder
New File
Copy
Cut
Delete
Paste
Rate
Upgrade
Rotate
Effect
Edit
Slide
History
#ifndef DATETIME_PERIOD_PARSER_HPP___ #define DATETIME_PERIOD_PARSER_HPP___ /* Copyright (c) 2002-2004 CrystalClear Software, Inc. * Use, modification and distribution is subject to the * Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) * Author: Jeff Garland, Bart Garst * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $ */ #include "boost/date_time/string_parse_tree.hpp" #include "boost/date_time/string_convert.hpp" namespace boost { namespace date_time { //! Not a facet, but a class used to specify and control period parsing /*! Provides settings for the following: * - period_separator -- default '/' * - period_open_start_delimeter -- default '[' * - period_open_range_end_delimeter -- default ')' * - period_closed_range_end_delimeter -- default ']' * - display_as_open_range, display_as_closed_range -- default closed_range * * For a typical date_period, the contents of the input stream would be *@code * [2004-Jan-04/2004-Feb-01] *@endcode * where the date format is controlled by the date facet */ template
class period_parser { public: typedef std::basic_string
string_type; typedef CharT char_type; //typedef typename std::basic_string
::const_iterator const_itr_type; typedef std::istreambuf_iterator
stream_itr_type; typedef string_parse_tree
parse_tree_type; typedef typename parse_tree_type::parse_match_result_type match_results; typedef std::vector
> collection_type; static const char_type default_period_separator[2]; static const char_type default_period_start_delimeter[2]; static const char_type default_period_open_range_end_delimeter[2]; static const char_type default_period_closed_range_end_delimeter[2]; enum period_range_option { AS_OPEN_RANGE, AS_CLOSED_RANGE }; //! Constructor that sets up period parser options period_parser(period_range_option range_option = AS_CLOSED_RANGE, const char_type* const period_separator = default_period_separator, const char_type* const period_start_delimeter = default_period_start_delimeter, const char_type* const period_open_range_end_delimeter = default_period_open_range_end_delimeter, const char_type* const period_closed_range_end_delimeter = default_period_closed_range_end_delimeter) : m_range_option(range_option) { delimiters.push_back(string_type(period_separator)); delimiters.push_back(string_type(period_start_delimeter)); delimiters.push_back(string_type(period_open_range_end_delimeter)); delimiters.push_back(string_type(period_closed_range_end_delimeter)); } period_parser(const period_parser
& p_parser) { this->delimiters = p_parser.delimiters; this->m_range_option = p_parser.m_range_option; } period_range_option range_option() const { return m_range_option; } void range_option(period_range_option option) { m_range_option = option; } collection_type delimiter_strings() const { return delimiters; } void delimiter_strings(const string_type& separator, const string_type& start_delim, const string_type& open_end_delim, const string_type& closed_end_delim) { delimiters.clear(); delimiters.push_back(separator); delimiters.push_back(start_delim); delimiters.push_back(open_end_delim); delimiters.push_back(closed_end_delim); } //! Generic code to parse a period -- no matter the period type. /*! This generic code will parse any period using a facet to * to get the 'elements'. For example, in the case of a date_period * the elements will be instances of a date which will be parsed * according the to setup in the passed facet parameter. * * The steps for parsing a period are always the same: * - consume the start delimiter * - get start element * - consume the separator * - get either last or end element depending on range settings * - consume the end delimeter depending on range settings * * Thus for a typical date period the contents of the input stream * might look like this: *@code * * [March 01, 2004/June 07, 2004] <-- closed range * [March 01, 2004/June 08, 2004) <-- open range * *@endcode */ template
period_type get_period(stream_itr_type& sitr, stream_itr_type& stream_end, std::ios_base& a_ios, const period_type& p, const duration_type& dur_unit, const facet_type& facet) const { // skip leading whitespace while(std::isspace(*sitr) && sitr != stream_end) { ++sitr; } typedef typename period_type::point_type point_type; point_type p1(not_a_date_time), p2(not_a_date_time); consume_delim(sitr, stream_end, delimiters[START]); // start delim facet.get(sitr, stream_end, a_ios, p1); // first point consume_delim(sitr, stream_end, delimiters[SEPARATOR]); // separator facet.get(sitr, stream_end, a_ios, p2); // second point // period construction parameters are always open range [begin, end) if (m_range_option == AS_CLOSED_RANGE) { consume_delim(sitr, stream_end, delimiters[CLOSED_END]);// end delim // add 1 duration unit to p2 to make range open p2 += dur_unit; } else { consume_delim(sitr, stream_end, delimiters[OPEN_END]); // end delim } return period_type(p1, p2); } private: collection_type delimiters; period_range_option m_range_option; enum delim_ids { SEPARATOR, START, OPEN_END, CLOSED_END }; //! throws ios_base::failure if delimiter and parsed data do not match void consume_delim(stream_itr_type& sitr, stream_itr_type& stream_end, const string_type& delim) const { /* string_parse_tree will not parse a string of punctuation characters * without knowing exactly how many characters to process * Ex [2000. Will not parse out the '[' string without knowing * to process only one character. By using length of the delimiter * string we can safely iterate past it. */ string_type s; for(unsigned int i = 0; i < delim.length() && sitr != stream_end; ++i) { s += *sitr; ++sitr; } if(s != delim) { throw std::ios_base::failure("Parse failed. Expected '" + convert_string_type
(delim) + "' but found '" + convert_string_type
(s) + "'"); } } }; template
const typename period_parser
::char_type period_parser
::default_period_separator[2] = {'/'}; template
const typename period_parser
::char_type period_parser
::default_period_start_delimeter[2] = {'['}; template
const typename period_parser
::char_type period_parser
::default_period_open_range_end_delimeter[2] = {')'}; template
const typename period_parser
::char_type period_parser
::default_period_closed_range_end_delimeter[2] = {']'}; } } //namespace boost::date_time #endif // DATETIME_PERIOD_PARSER_HPP___
period_parser.hpp
Page URL
File URL
Prev
37/60
Next
Download
( 8 KB )
Note: The DriveHQ service banners will NOT be displayed if the file owner is a paid member.
Comments
Total ratings:
0
Average rating:
Not Rated
Would you like to comment?
Join DriveHQ
for a free account, or
Logon
if you are already a member.