...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
A Scalar Expression is an expression convertible to a scalar type.
Default Constructible.
Public base  scaler_expression<S>  S must be derived from this public base type. 
Value type  value_type 
The type of the scalar expression. 
S 
A type that is a model of Scalar Expression 
In addition to the expressions defined in Default Constructible the following expressions must be valid.
Name  Expression  Type requirements  Return type 

Evaluation  operator value_type () const 
value_type 
Semantics of an expression is defined only where it differs from, or is not defined in Default Constructible.
Name  Expression  Precondition  Semantics  Postcondition 

Evaluation  operator value_type () const 
Evaluates the scalar expression. 
The runtime complexity of the evaluation is specific for the evaluated scalar expression.
vector_scalar_unary
vector_scalar_binary
A Vector Expression is an expression evaluatable to a vector. Vector Expression provides an Indexed Bidirectional Iterator or an Indexed Random Access Iterator .
Default Constructible.
Public base  vector_expression<V>  V must be derived from this public base type. 
Value type  value_type 
The element type of the vector expression. 
Reference type  reference 
The return type when accessing an element of a vector expression.
Convertable to a value_type .

Const reference type  const_reference 
The return type when accessing an element of a constant vector expression.
Convertable to a value_type .

Size type  size_type 
The index type of the vector expression. Am unsigned integral type used to represent size and index values.
Can represent any nonnegative value of difference_type .

Distance type  difference_type 
A signed integral type used to represent the distance between two of the vector expression's iterators. 
Const iterator type  const_iterator 
A type of iterator that may be used to examine a vector expression's elements. 
Iterator type  iterator 
A type of iterator that may be used to modify a vector expression's elements. 
Const reverse iterator type  const_reverse_iterator 
A Reverse Iterator adaptor whose base iterator type is the vector expression's const iterator type. 
Reverse iterator type  reverse_iterator 
A Reverse Iterator adaptor whose base iterator type is the vector expression's iterator type. 
V 
A type that is a model of Vector Expression 
v, v1, v2 
Object of type V 
i 
Object of a type convertible to size_type 
t 
Object of a type convertible to value_type 
In addition to the expressions defined in Default Constructible the following expressions must be valid.
Name  Expression  Type requirements  Return type 

Beginning of range  v.begin () 
const_iterator 

v.begin () 
v is mutable. 
iterator 

End of range  v.end () 
const_iterator 

v.end () 
v is mutable. 
iterator 

Size  v.size () 
size_type 

Swap  v1.swap (v2) 
v1 and v2 are mutable. 
void 
Beginning of reverse range  v.rbegin () 
const_reverse_iterator 

v.rbegin () 
v is mutable. 
reverse_iterator 

End of reverse range  v.rend () 
const_reverse_iterator 

v.rend () 
v is mutable. 
reverse_iterator 

Element access  v (i) 
i is convertible to size_type . 
Convertible to value_type . 
Assignment  v2 = v1 
v2 is mutable and v1 is convertible
to V . 
V & 
v2.assign (v1) 
v2 is mutable and v1 is convertible
to V . 
V & 

Computed assignment  v2 += v1 
v2 is mutable and v1 is convertible
to V . 
V & 
v2.plus_assign (v1) 
v2 is mutable and v1 is convertible
to V . 
V & 

v2 = v1 
v2 is mutable and v1 is convertible
to V . 
V & 

v2.minus_assign (v1) 
v2 is mutable and v1 is convertible
to V . 
V & 

v *= t 
v is mutable and t is convertible to
value_type . 
V & 
Semantics of an expression is defined only where it differs from, or is not defined in Default Constructible.
Name  Expression  Precondition  Semantics  Postcondition 

Beginning of range  v.begin () 
Returns an iterator pointing to the first element in the vector expression.  v.begin () is either dereferenceable or
pasttheend. It is pasttheend if and only if v.size () ==
0 . 

End of range  v.end () 
Returns an iterator pointing one past the last element in the vector expression.  v.end () is pasttheend. 

Size  v.size () 
Returns the size of the vector expression, that is, its number of elements.  v.size () >= 0 

Swap  v1.swap (v2) 
Equivalent to swap (v1, v2) . 

Beginning of reverse range  v.rbegin () 
Equivalent to reverse_iterator (v.end ()) . 
v.rbegin () is either dereferenceable or
pasttheend. It is pasttheend if and only if v.size () ==
0 . 

End of reverse range  v.rend () 
Equivalent to reverse_iterator (v.begin ()) . 
v.rend () is pasttheend. 

Element access  v (i) 
0 <= i < v.size () 
Returns the i th element of the vector
expression. 

Assignment  v2 = v1 
v1.size () == v2.size () 
Assigns every element of the evaluated vector expression
v1 to the corresponding element of v2
. 

v2.assign (v1) 
v1.size () == v2.size () 
Assigns every element of v1 to the corresponding
element of v2 . 

Computed assignment  v2 += v1 
v1.size () == v2.size () 
Adds every element of the evaluated vector expression
v1 to the corresponding element of
v2 . 

v2.plus_assign (v1) 
v1.size () == v2.size () 
Adds every element of v1 to the corresponding
element of v2 . 

v2 = v1 
v1.size () == v2.size () 
Subtracts every element of the evaluated vector expression
v1 from the corresponding element of v2
. 

v2.minus_assign (v1) 
v1.size () == v2.size () 
Subtracts every element of v1 from the
corresponding element of v2 . 

v *= t 
Multiplies every element of v with t
. 
The runtime complexity of begin ()
and end
()
is specific for the evaluated vector expression,
typically amortized constant time.
The runtime complexity of size ()
is constant
time.
The runtime complexity of swap ()
is specific for
the evaluated vector expression, typically constant time.
The runtime complexity of rbegin ()
and rend
()
is specific for the evaluated vector expression,
typically amortized constant time.
The runtime complexity of the element access is specific for the evaluated vector expression, typically amortized constant time for the dense and logarithmic for the sparse case.
The runtime complexity of the arithmetic operations is specific for the evaluated vector expressions, typically linear in the size of the expressions.
Valid range  For any vector expression v , [v.begin (),
v.end ()) is a valid range. 
Completeness  An algorithm that iterates through the range [v.begin (),
v.end ()) will pass through every element of v
. 
Valid reverse range  [v.rbegin (), v.rend ()) is a valid range. 
Equivalence of ranges  The distance from v.begin () to v.end
() is the same as the distance from v.rbegin ()
to v.rend () . 
vector_range;
vector_slice
matrix_row
matrix_column
matrix_vector_range
matrix_vector_slice
vector_unary
vector_binary
vector_binary_scalar1
vector_binary_scalar2
matrix_vector_unary1
matrix_vector_unary2
matrix_vector_binary1
matrix_vector_binary2
A Matrix Expression is an expression evaluatable to a matrix. Matrix Expression provides an Indexed Bidirectional Column/Row Iterator or an Indexed Random Access Column/Row Iterator .
Default Constructible.
Public base  matrix_expression<M>  M must be derived from this public base type. 
Value type  value_type 
The element type of the matrix expression. 
Reference type  reference 
The return type when accessing an element of a matrix expression.
Convertable to a value_type .

Const reference type  const_reference 
The return type when accessing an element of a constant matrix expression.
Convertable to a value_type .

Size type  size_type 
The index type of the matrix expression. Am unsigned integral type used to represent size and index values.
Can represent any nonnegative value of difference_type .

Distance type  difference_type 
A signed integral type used to represent the distance between two of the matrix expression's iterators. 
Const iterator types  const_iterator1 
A type of column iterator that may be used to examine a matrix expression's elements. 
const_iterator2 
A type of row iterator that may be used to examine a matrix expression's elements.  
Iterator types  iterator1 
A type of column iterator that may be used to modify a matrix expression's elements. 
iterator2 
A type of row iterator that may be used to modify a matrix expression's elements.  
Const reverse iterator types  const_reverse_iterator1 
A Reverse Iterator adaptor whose base iterator type is the matrix expression's const column iterator type. 
const_reverse_iterator2 
A Reverse Iterator adaptor whose base iterator type is the matrix expression's const row iterator type.  
Reverse iterator types  reverse_iterator1 
A Reverse Iterator adaptor whose base iterator type is the matrix expression's column iterator type. 
reverse_iterator2 
A Reverse Iterator adaptor whose base iterator type is the matrix expression's row iterator type. 
M 
A type that is a model of Matrix Expression 
m, m1, m2 
Object of type M 
i, j 
Objects of a type convertible to size_type 
t 
Object of a type convertible to value_type 
In addition to the expressions defined in Default Constructible the following expressions must be valid.
Name  Expression  Type requirements  Return type 

Beginning of range  m.begin1 () 
const_iterator1 

m.begin2 () 
const_iterator2 

m.begin1 () 
m is mutable. 
iterator1 

m.begin2 () 
m is mutable. 
iterator2 

End of range  m.end1 () 
const_iterator1 

m.end2 () 
const_iterator2 

m.end1 () 
m is mutable. 
iterator1 

m.end2 () 
m is mutable. 
iterator2 

Size  m.size1 () 
size_type 

m.size2 () 
size_type 

Swap  m1.swap (m2) 
m1 and m2 are mutable. 
void 
Beginning of reverse range  m.rbegin1 () 
const_reverse_iterator1 

m.rbegin2 () 
const_reverse_iterator2 

m.rbegin1 () 
m is mutable. 
reverse_iterator1 

m.rbegin2 () 
m is mutable. 
reverse_iterator2 

End of reverse range  m.rend1 () 
const_reverse_iterator1 

m.rend2 () 
const_reverse_iterator2 

m.rend1 () 
m is mutable. 
reverse_iterator1 

m.rend2 () 
m is mutable. 
reverse_iterator2 

Element access  m (i, j) 
i and j are convertible to
size_type . 
Convertible to value_type . 
Assignment  m2 = m1 
m2 is mutable and m1 is convertible
to M . 
M & 
m2.assign (m1) 
m2 is mutable and m1 is convertible
to M . 
M & 

Computed assignment  m2 += m1 
m2 is mutable and m1 is convertible
to M . 
M & 
m2.plus_assign (m1) 
m2 is mutable and m1 is convertible
to M . 
M & 

m2 = m1 
m2 is mutable and m1 is convertible
to M . 
M & 

m2.minus_assign (m1) 
m2 is mutable and m1 is convertible
to M . 
M & 

m *= t 
m is mutable and t is convertible to
value_type . 
M & 
Semantics of an expression is defined only where it differs from, or is not defined in Default Constructible.
Name  Expression  Precondition  Semantics  Postcondition 

Beginning of range  m.begin1 () 
Returns an iterator pointing to the first element in the first column of a matrix expression.  m.begin1 () is either dereferenceable or
pasttheend. It is pasttheend if and only if m.size1 () ==
0 . 

m.begin2 () 
Returns an iterator pointing to the first element in the first row of a matrix expression.  m.begin2 () is either dereferenceable or
pasttheend. It is pasttheend if and only if m.size2 () ==
0 . 

End of range  m.end1 () 
Returns an iterator pointing one past the last element in the matrix expression.  m.end1 () is pasttheend. 

m.end2 () 
Returns an iterator pointing one past the last element in the matrix expression.  m.end2 () is pasttheend. 

Size  m.size1 () 
Returns the number of rows of the matrix expression.  m.size1 () >= 0 

m.size2 () 
Returns the number of columns of the matrix expression.  m.size2 () >= 0 

Swap  m1.swap (m2) 
Equivalent to swap (m1, m2) . 

Beginning of reverse range  m.rbegin1 () 
Equivalent to reverse_iterator1 (m.end1 ()) . 
m.rbegin1 () is either dereferenceable or
pasttheend. It is pasttheend if and only if m.size1 () ==
0 . 

m.rbegin2 () 
Equivalent to reverse_iterator2 (m.end2 ()) . 
m.rbegin2 () is either dereferenceable or
pasttheend. It is pasttheend if and only if m.size2 () ==
0 . 

End of reverse range  m.rend1 () 
Equivalent to reverse_iterator1 (m.begin1
()) . 
m.rend1 () is pasttheend. 

m.rend2 () 
Equivalent to reverse_iterator2 (m.begin2
()) . 
m.rend2 () is pasttheend. 

Element access  m (i, j) 
0 <= i < m.size1 () and 0 <= j <
m.size2 () 
Returns the j th element of the i th
row of the matrix expression. 

Assignment  m2 = m1 
m1.size1 () == m2.size1 () and

Assigns every element of the evaluated matrix expression
m1 to the corresponding element of m2
. 

m2.assign (m1) 
m1.size1 () == m2.size1 () and

Assigns every element of m1 to the corresponding
element of m2 . 

Computed assignment  m2 += m1 
m1.size1 () == m2.size1 () and

Adds every element of the evaluated matrix expression
m1 to the corresponding element of
m2 . 

m2.plus_assign (m1) 
m1.size1 () == m2.size1 () and

Adds every element of m1 to the corresponding
element of m2 . 

m2 = m1 
m1.size1 () == m2.size1 () and

Subtracts every element of the evaluated matrix expression
m1 from the corresponding element of m2
. 

m2.minus_assign (m1) 
m1.size1 () == m2.size1 () and

Subtracts every element of m1 from the
corresponding element of m2 . 

m *= t 
Multiplies every element of m with t
. 
The runtime complexity of begin1 ()
, begin2
()
, end1 ()
and end2 ()
is
specific for the evaluated matrix expression.
The runtime complexity of size1 ()
and size2
()
is constant time.
The runtime complexity of swap ()
is specific for
the evaluated matrix expression, typically constant time.
The runtime complexity of rbegin1 ()
,
rbegin2 ()
, rend1 ()
and rend2
()
is specific for the evaluated matrix expression.
The runtime complexity of the element access is specific for the evaluated matrix expression, typically amortized constant time for the dense and logarithmic for the sparse case.
The runtime complexity of the arithmetic operations is specific for the evaluated matrix expressions, typically quadratic in the size of the proxies.
Valid range  For any matrix expression m , [m.begin1 (),
m.end1 ()) and [m.begin2 (), m.end2 ()) are
valid ranges. 
Completeness  An algorithm that iterates through the range [m.begin1
(), m.end1 ()) will pass through every row of m
, an algorithm that iterates through the range [m.begin2 (),
m.end2 ()) will pass through every column of m
. 
Valid reverse range  [m.rbegin1 (), m.rend1 ()) and [m.rbegin2
(), m.rend2 ()) are valid ranges. 
Equivalence of ranges  The distance from m.begin1 () to m.end1
() is the same as the distance from m.rbegin1
() to m.rend1 () and the distance from
m.begin2 () to m.end2 () is the same as
the distance from m.rbegin2 () to m.rend2
() . 
matrix_range
matrix_slice;
triangular_adaptor
symmetric_adaptor
banded_adaptor
vector_matrix_binary
matrix_unary1
matrix_unary2
matrix_binary
matrix_binary_scalar1
matrix_binary_scalar2
matrix_matrix_binary
Copyright (©) 20002002 Joerg Walter, Mathias Koch
Permission to copy, use, modify, sell and distribute this document
is granted provided this copyright notice appears in all copies.
This document is provided ``as is'' without express or implied
warranty, and with no claim as to its suitability for any
purpose.