section 6H
X_lens_less_final

home

Classes var_lens_less_final and con_lens_less_final differ substiantially from the other lenses presented here. In particular, they cannot be lensed by other lenses; thus the "final" in the name. These two lenses amount to housing for a subscript to a matrix, and they come close to being the multidimensional equivalent of the Standard Library's std::vector::iterator and std::vector::const_iterator.

In line with X_lens_less_dimen, the subscript stored inside the lens is called a marker.

As an example, with a matrix whose form is ( 1 =< 3, 2 =< 6, 5 =< 8 ), an X_lens_less_final constructor would need a parameter similar to this:

    vec_si const w {2, 4, 7};   
where the number of components is equal to the dimensionality of the matrix being lensed. In contrast with X_lens_less_dimen, there is no use for a null_int. This vec_si parameter becomes the current marker, and the corresponding component will be the only component visible until the marker is changed.

There are eight functions to manage markers:

    vec_si const & marker_get () const;
    sign_int marker_get (sign_int const pos) const;
    sign_int marker_bot (sign_int const pos) const;
    sign_int marker_top (sign_int const pos) const;

    void marker_set (vec_si const & v);
    void marker_set (sign_int const pos, sign_int const val);
    void marker_add (sign_int const pos, sign_int const val);
    void marker_sub (sign_int const pos, sign_int const val);
Available for all X_lens_less_final: Not available for X_lens_less_final const:

Because only one component is visible at any time, the functions to access it differ somewhat from those for the other lenses:

    compo get () const;              // var_ and con_
    compo const & con_ref () const;  // var_ and con_
    compo & var_ref () const;        // var_ only
    void set (compo const c) const;  // var_ only
As with X_lens_less_dimen, no alarm is given if the programmer sets the marker to a value out of range — this is analogous to when the programmer sets a Standard Library iterator to a value that does not reference a component. The bool function can_deref is available, and it returns true when the marker is within range; false when is out of range. Setting a marker out of range does not cause malfunction as long as it is not deferenced; subsequently setting the marker to a value within range will allow it to be deferenced without trouble.
As an example, this code:
#include "SOME_DIRECTORY/mat_gen_dim.h"
using namespace mat_gen_dim;

int main () {
    form const frm_a {blt{1,3},blt{2,6},blt{5,8}};
    cout << "\nfrm_a: " << frm_a;
    var_matrix<double> mat_a {sub_matrix_linear (frm_a, 0.0)};
    cout << "\nmat_a before: " << mat_a;

    vec_si const w {2, 4, 7};   
    var_lens_less_final<double> ald_b {mat_a, w};
    cout << "\nald_b with marker at (2, 4, 7): " << ald_b.get();

    ald_b.marker_set (0, 1);
    ald_b.marker_set (2, 6);
    cout << "\nald_b with marker at (1, 4, 6): " << ald_b.get();

    ald_b.marker_set (vec_si {2,3,5});
    ald_b.set (382.0);

    cout << "\nmat_a after: " << mat_a;

    return 0;
}
yields this output:
frm_a: ( 1 =< 3, 2 =< 6, 5 =< 8 )
mat_a before: 
    ( 1 2 5 ) = 0.125    ( 1 2 6 ) = 0.126    ( 1 2 7 ) = 0.127
    ( 1 3 5 ) = 0.135    ( 1 3 6 ) = 0.136    ( 1 3 7 ) = 0.137
    ( 1 4 5 ) = 0.145    ( 1 4 6 ) = 0.146    ( 1 4 7 ) = 0.147
    ( 1 5 5 ) = 0.155    ( 1 5 6 ) = 0.156    ( 1 5 7 ) = 0.157
    ( 2 2 5 ) = 0.225    ( 2 2 6 ) = 0.226    ( 2 2 7 ) = 0.227
    ( 2 3 5 ) = 0.235    ( 2 3 6 ) = 0.236    ( 2 3 7 ) = 0.237
    ( 2 4 5 ) = 0.245    ( 2 4 6 ) = 0.246    ( 2 4 7 ) = 0.247
    ( 2 5 5 ) = 0.255    ( 2 5 6 ) = 0.256    ( 2 5 7 ) = 0.257
ald_b with marker at (2, 4, 7): 0.247
ald_b with marker at (1, 4, 6): 0.146
mat_a after: 
    ( 1 2 5 ) = 0.125    ( 1 2 6 ) = 0.126    ( 1 2 7 ) = 0.127
    ( 1 3 5 ) = 0.135    ( 1 3 6 ) = 0.136    ( 1 3 7 ) = 0.137
    ( 1 4 5 ) = 0.145    ( 1 4 6 ) = 0.146    ( 1 4 7 ) = 0.147
    ( 1 5 5 ) = 0.155    ( 1 5 6 ) = 0.156    ( 1 5 7 ) = 0.157
    ( 2 2 5 ) = 0.225    ( 2 2 6 ) = 0.226    ( 2 2 7 ) = 0.227
    ( 2 3 5 ) = 382      ( 2 3 6 ) = 0.236    ( 2 3 7 ) = 0.237
    ( 2 4 5 ) = 0.245    ( 2 4 6 ) = 0.246    ( 2 4 7 ) = 0.247
    ( 2 5 5 ) = 0.255    ( 2 5 6 ) = 0.256    ( 2 5 7 ) = 0.257