Note that every member of a Character Traits class is static.  
There is never any need to create a Character Traits object, and, in
fact, there is no guarantee that creating such objects is possible.
| 
Value type
 | 
X::char_type
 | 
The character type described by this Character Traits type.
 | 
| 
Int type
 | 
X::int_type
 | 
A type that is capable of representing every valid value of type
   char_type, and, additionally an end-of-file value.  For char,
   for example, the int type may be int, and for wchar_t it may 
   be wint_t.
 | 
| 
Position type
 | 
X::pos_type
 | 
A type that can represent the position of a character of type
   char_type within a file.  This type is usually streampos.
 | 
| 
Offset type
 | 
X::off_type
 | 
An integer type that can represent the difference between two
   pos_type values.  This type is usually streamoff.
 | 
| 
State type
 | 
X::state_type
 | 
A type that can represent a state in a multibyte encoding
   scheme.  This type, if used at all, is usually mbstate_t.
 | 
| 
Name
 | 
Expression
 | 
Precondition
 | 
Semantics
 | 
Postcondition
 | 
| 
Character assignment
 | 
X::assign(c1, c2)
 | 
 
 | 
Performs the assignment c1 = c2
 | 
X::eq(c1, c2) is true.
 | 
| 
Character equality
 | 
X::eq(c1, c2)
 | 
 
 | 
Returns true if and only if c1 and c2 are equal.
 | 
 
 | 
| 
Character comparison
 | 
X::lt(c1, c2)
 | 
 
 | 
Returns true if and only if c1 is less than c2.  Note that
   for any two value values c1 and c2, exactly one of 
   X::lt(c1, c2), X::lt(c2, c1), and X::eq(c1, c2) should be
   true.
 | 
 
 | 
| 
Range comparison
 | 
X::compare(p1, p2, n)
 | 
[p1, p1+n) and [p2, p2+n) are valid ranges.
 | 
Generalization of strncmp.  Returns 0 if every element
   in [p1, p1+n) is equal to the corresponding element 
   in [p2, p2+n), a negative value if there exists an element
   in [p1, p1+n) less than the corresponding element in [p2, p2+n)
   and all previous elements are equal, and a positive value 
   if there exists an element in [p1, p1+n) greater than the
   corresponding element in [p2, p2+n) and all previous elements
   are equal.
 | 
 
 | 
| 
Length
 | 
X::length(p)
 | 
 
 | 
Generalization of strlen.
   Returns the smallest non-negative number n such that 
   X::eq(p+n, X::char_type()) is true.  Behavior is undefined
   if no such n exists.
 | 
 
 | 
| 
Find
 | 
X::find(p, n, c)
 | 
[p, p+n) is a valid range.
 | 
Generalization of strchr.  Returns the first pointer q
   in [p, p+n) such that X::eq(*q, c) is true.  Returns a 
   null pointer if no such pointer exists.  (Note that this method
   for indicating a failed search differs from that is 
   find.)
 | 
 
 | 
| 
Move
 | 
X::move(s, p, n)
 | 
[p, p+n) and [s, s+n) are valid ranges (possibly overlapping).
 | 
Generalization of memmove.  Copies values from the range
   [p, p+n) to the range [s, s+n), and returns s.
 | 
 
 | 
| 
Copy
 | 
X::copy(s, p, n)
 | 
[p, p+n) and [s, s+n) are valid ranges which do not overlap.
 | 
Generalization of memcpy.  Copies values from the range
   [p, p+n) to the range [s, s+n), and returns s.
 | 
 
 | 
| 
Range assignment
 | 
X::assign(s, n, c)
 | 
[s, s+n) is a valid range.
 | 
Generalization of memset.  Assigns the value c to each pointer
   in the range [s, s+n), and returns s.
 | 
 
 | 
| 
EOF value
 | 
X::eof()
 | 
 
 | 
Returns a value that can represent EOF.
 | 
X::eof() is distinct from every valid value of type
   X::char_type.  That is, there exists no value c
   such that X::eq_int_type(X::to_int_type(c), X::eof()) is true.
 | 
| 
Not EOF
 | 
X::not_eof(e)
 | 
 
 | 
Returns e if e represents a valid char_type value, and some
   non-EOF value if e is X::eof().
 | 
 
 | 
| 
Convert to value type
 | 
X::to_char_type(e)
 | 
 
 | 
Converts e to X's int type.  If e is a representation of some
   char_type value then it returns that value; if e is X::eof()
   then the return value is unspecified.
 | 
 
 | 
| 
Convert to int type
 | 
X::to_int_type(c)
 | 
 
 | 
Converts c to X's int type.
 | 
X::to_char_type(X::to_int_type(c)) is a null operation.
 | 
| 
Equal int type values
 | 
X::eq_int_type(e1, e2)
 | 
 
 | 
Compares two int type values.  If there exist values of type
   X::char_type such that e1 is X::to_int_type(c1)) and
   e2 is X::to_int_type(c2)), then X::eq_int_type(e1, e2) is
   the same as X::eq(c1, c2).  Otherwise, eq_int_type returns
   true if e1 and e2 are both EOF and false if one of
   e1 and e2 is EOF and the other is not.
 | 
 
 | 
All other operations are constant time.