// @topic W040503 substring class with overloaded operators
// @brief class substring declaration
// CIS-255 substring class
#ifndef _CIS62_SUBSTRING_H_INCLUDED_
#define _CIS62_SUBSTRING_H_INCLUDED_
#include <string>
class substring {
std::string& m_str;
size_t m_begin;
size_t m_end;
public:
// Constructor that takes a reference to a string:
substring( std::string& str );
// Constructor that takes string reference, beginning, and ending positions
substring( std::string& str, size_t pos_begin, size_t pos_end );
// Return copy of the substring as std::string object
std::string str() const;
// Return substring size
size_t size() const;
// Return beginning position
size_t begin() const;
// Return ending position
size_t end() const;
// Set beginning position
void begin( size_t pos );
// Set ending position
void end( size_t pos );
// The string content is set to an empty string
void clear();
// Replace substring with str
substring& replace( std::string const& str );
// Fill substring with a particular character
substring& fill( char ch );
// Insert str at the specified position:
substring& insert( std::string const& str, size_t pos );
// Convert substring to UPPER CASE
substring& toupper();
// Convert substring to lower case
substring& tolower();
// Search for a new substring starting at the specified position:
size_t search( const std::string& str, size_t pos );
// The string content is set to the size of entire string
void expand();
// Equality test between two substrings
bool equals_to( substring const& other ) const;
// Equality test between substring and std::string
bool equals_to( std::string const& str ) const;
// Merge with another substring
substring& merge( substring const& other );
// Swap with another substring
void swap( substring& other );
// Prepare substring for parsing
substring& parse();
// Test if substring is alphabetic
substring& isalpha();
// Test if substring is upper case
substring& isupper();
// Test if substring is lower case
substring& islower();
// Test if substring is digit
substring& isdigit();
// Test if substring is alphabetic or digit
substring& isalnum();
// Test if substring is blank, tab, newline, return, formfeed, or vertical tab
substring& isspace();
// Test if substring is matches text specified by str
substring& isstr( const std::string& str );
// Test if substring is empty
substring& isempty();
// Return true if parsing succeeded, false otherwise
bool succeeded() const;
// Return matching substring
substring match() const;
// Undo changes caused by parsing
substring& unparse();
// PART 2 -- overloaded operators
public:
friend std::ostream& operator<<( std::ostream& os, substring const& sub );
friend bool operator==( substring const& one, substring const& another );
friend bool operator==( std::string const& str, substring const& sub );
friend bool operator==( substring const& sub, char const* cstr );
// Operators overloaded as members functions:
// Assignments:
substring& operator=( substring const& other );
substring& operator=( std::string const& str );
// Merge with another substring:
substring& operator+=( substring const& other );
// Compare with another substring:
bool operator>( substring const& other ) const;
bool operator<( substring const& other ) const;
// Subscript access to individual characters within substring:
char& operator[]( size_t idx );
char operator[]( size_t idx ) const;
};//class substring
// Operators overloaded as non-member functions:
std::ostream& operator<<( std::ostream& os, substring const& sub );
// Equality/Inequality tests between two substrings:
bool operator==( substring const& one, substring const& another );
bool operator!=( substring const& one, substring const& another );
// Equality/Inequality tests between substring and std::string:
bool operator==( std::string const& str, substring const& sub );
bool operator==( substring const& sub, std::string const& str );
bool operator!=( std::string const& str, substring const& sub );
bool operator!=( substring const& sub, std::string const& str );
// Equality/Inequality tests between substring and zero-terminated string:
bool operator==( substring const& sub, char const* cstr );
bool operator!=( substring const& sub, char const* cstr );
bool operator==( char const* cstr, substring const& sub );
bool operator!=( char const* cstr, substring const& sub );
#endif // _CIS62_SUBSTRING_H_INCLUDED_