view mayachemtools/docs/modules/html/code/Vector.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:Vector.pm</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
<a name="package-Vector-"></a>   1 <span class="k">package </span><span class="i">Vector</span><span class="sc">;</span>
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: Vector.pm,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:47:30 $</span>
   5 <span class="c"># $Revision: 1.34 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
  32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">StatisticsUtil</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  34 
  35 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
  36 
  37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
  38 <span class="i">@EXPORT</span> = <span class="q">qw(IsVector UnitXVector UnitYVector UnitZVector UnitVector ZeroVector)</span><span class="sc">;</span>
  39 <span class="i">@EXPORT_OK</span> = <span class="q">qw(SetValuePrintFormat)</span><span class="sc">;</span>
  40 
  41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span>
  42                 <span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span>
  43                <span class="s">)</span><span class="sc">;</span>
  44 
  45 <span class="c"># Setup class variables...</span>
  46 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ValueFormat</span><span class="s">)</span><span class="sc">;</span>
  47 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  48 
  49 <span class="c">#</span>
  50 <span class="c"># Using the following explicity overloaded operators, Perl automatically generates methods</span>
  51 <span class="c"># for operations with no explicitly defined methods. Autogenerated methods are possible for</span>
  52 <span class="c"># these operators:</span>
  53 <span class="c">#</span>
  54 <span class="c">#    o Arithmetic operators: += -= *= /= **= %= ++ -- x= .=</span>
  55 <span class="c">#    o Increment and decrement: ++ --</span>
  56 <span class="c">#</span>
  57 <span class="c"># &#39;fallback&#39; is set to &#39;false&#39; to raise exception for all other operators.</span>
  58 <span class="c">#</span>
  59 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyVector&#39;</span><span class="cm">,</span>
  60 
  61   <span class="q">&#39;0+&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_NumifyVector&#39;</span><span class="cm">,</span>
  62 
  63   <span class="q">&#39;@{}&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorToArrayOperator&#39;</span><span class="cm">,</span>
  64 
  65   <span class="q">&#39;+&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorAdditionOperator&#39;</span><span class="cm">,</span>
  66   <span class="q">&#39;-&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorSubtractionOperator&#39;</span><span class="cm">,</span>
  67   <span class="q">&#39;*&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorMultiplicationOperator&#39;</span><span class="cm">,</span>
  68   <span class="q">&#39;/&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorDivisionOperator&#39;</span><span class="cm">,</span>
  69   <span class="q">&#39;**&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorExponentiationOperator&#39;</span><span class="cm">,</span>
  70   <span class="q">&#39;%&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorModulusOperator&#39;</span><span class="cm">,</span>
  71 
  72   <span class="q">&#39;x&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorCrossProductOperator&#39;</span><span class="cm">,</span>
  73   <span class="q">&#39;.&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorDotProductOperator&#39;</span><span class="cm">,</span>
  74 
  75   <span class="q">&#39;bool&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorBooleanOperator&#39;</span><span class="cm">,</span>
  76   <span class="q">&#39;!&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorNotBooleanOperator&#39;</span><span class="cm">,</span>
  77 
  78   <span class="q">&#39;==&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorEqualOperator&#39;</span><span class="cm">,</span>
  79   <span class="q">&#39;!=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorNotEqualOperator&#39;</span><span class="cm">,</span>
  80   <span class="q">&#39;&lt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorLessThanOperator&#39;</span><span class="cm">,</span>
  81   <span class="q">&#39;&lt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorLessThanEqualOperator&#39;</span><span class="cm">,</span>
  82   <span class="q">&#39;&gt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorGreatarThanOperator&#39;</span><span class="cm">,</span>
  83   <span class="q">&#39;&gt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorGreatarThanEqualOperator&#39;</span><span class="cm">,</span>
  84 
  85   <span class="q">&#39;neg&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorNegativeValueOperator&#39;</span><span class="cm">,</span>
  86 
  87   <span class="q">&#39;abs&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorAbsoluteValueOperator&#39;</span><span class="cm">,</span>
  88   <span class="q">&#39;exp&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorExpNaturalBaseOperator&#39;</span><span class="cm">,</span>
  89   <span class="q">&#39;log&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorLogNaturalBaseOperator&#39;</span><span class="cm">,</span>
  90   <span class="q">&#39;sqrt&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorSquareRootOperator&#39;</span><span class="cm">,</span>
  91   <span class="q">&#39;cos&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorCosineOperator&#39;</span><span class="cm">,</span>
  92   <span class="q">&#39;sin&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_VectorSineOperator&#39;</span><span class="cm">,</span>
  93 
  94   <span class="q">&#39;fallback&#39;</span> <span class="cm">=&gt;</span> <span class="k">undef</span><span class="sc">;</span>
  95 
  96 <span class="c"># Class constructor...</span>
<a name="new-"></a>  97 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
  98   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  99 
 100   <span class="c"># Initialize object...</span>
 101   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
 102   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
 103   <span class="i">$This</span><span class="i">-&gt;_InitializeVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 104 
 105   <span class="i">$This</span><span class="i">-&gt;_AddValues</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 106 
 107   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 108 <span class="s">}</span>
 109 
 110 <span class="c"># Initialize object data...</span>
 111 <span class="c">#</span>
<a name="_InitializeVector-"></a> 112 <span class="k">sub </span><span class="m">_InitializeVector</span> <span class="s">{</span>
 113   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 114 
 115   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 116 <span class="s">}</span>
 117 
 118 <span class="c"># Initialize class ...</span>
<a name="_InitializeClass-"></a> 119 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
 120   <span class="c">#Class name...</span>
 121   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
 122 
 123   <span class="c"># Print format for vector values...</span>
 124   <span class="i">$ValueFormat</span> = <span class="q">&quot;%g&quot;</span><span class="sc">;</span>
 125 <span class="s">}</span>
 126 
 127 <span class="c"># Initialize vector values using:</span>
 128 <span class="c">#    o List of values</span>
 129 <span class="c">#    o Reference to an list of values</span>
 130 <span class="c">#    o Another vector object</span>
 131 <span class="c">#</span>
<a name="_AddValues-"></a> 132 <span class="k">sub </span><span class="m">_AddValues</span> <span class="s">{</span>
 133   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 134 
 135   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
 136     <span class="k">return</span><span class="sc">;</span>
 137   <span class="s">}</span>
 138 
 139   <span class="c"># Set vector values...</span>
 140   <span class="k">my</span><span class="s">(</span><span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="s">)</span><span class="sc">;</span>
 141   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span>
 142   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span>
 143   <span class="k">if</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^(SCALAR|HASH|CODE|REF|GLOB)/</span><span class="s">)</span> <span class="s">{</span>
 144     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_AddValues: Trying to add values to vector object with a reference to unsupported value format...&quot;</span><span class="sc">;</span>
 145   <span class="s">}</span>
 146 
 147   <span class="k">if</span> <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 148     <span class="c"># Initialize using Vector...</span>
 149     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$FirstValue</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 150   <span class="s">}</span>
 151   <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
 152     <span class="c"># Initialize using array refernce...</span>
 153     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@</span>{<span class="i">$FirstValue</span>}<span class="sc">;</span>
 154   <span class="s">}</span>
 155   <span class="k">else</span> <span class="s">{</span>
 156     <span class="c"># It&#39;s a list of values...</span>
 157     <span class="k">push</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="cm">,</span> <span class="i">@Values</span><span class="sc">;</span>
 158   <span class="s">}</span>
 159 <span class="s">}</span>
 160 
 161 <span class="c"># Add values to a vector using a vector, reference to an array or an array...</span>
<a name="AddValues-"></a> 162 <span class="k">sub </span><span class="m">AddValues</span> <span class="s">{</span>
 163   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 164 
 165   <span class="i">$This</span><span class="i">-&gt;_AddValues</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 166 
 167   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 168 <span class="s">}</span>
 169 
 170 <span class="c"># Copy vector...</span>
<a name="Copy-"></a> 171 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
 172   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 173   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span>
 174 
 175   <span class="c"># Copy vector values...</span>
 176   <span class="i">$Vector</span> = <span class="s">(</span><span class="k">ref</span> <span class="i">$This</span><span class="s">)</span><span class="i">-&gt;new</span><span class="s">(</span>\<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="s">)</span><span class="sc">;</span>
 177 
 178   <span class="c"># Copy value format for stringification...</span>
 179   <span class="k">if</span> <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>}<span class="s">)</span> <span class="s">{</span>
 180     <span class="i">$Vector</span>-&gt;{<span class="w">ValueFormat</span>} = <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>}<span class="sc">;</span>
 181   <span class="s">}</span>
 182   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 183 <span class="s">}</span>
 184 
 185 <span class="c"># Get 3D vector length...</span>
<a name="GetLength-"></a> 186 <span class="k">sub </span><span class="m">GetLength</span> <span class="s">{</span>
 187   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 188 
 189   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 190     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetGetLength: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 191   <span class="s">}</span>
 192   <span class="k">my</span><span class="s">(</span><span class="i">$Length</span><span class="cm">,</span> <span class="i">$DotProduct</span><span class="s">)</span><span class="sc">;</span>
 193   <span class="i">$DotProduct</span> = <span class="i">$This</span> . <span class="i">$This</span><span class="sc">;</span>
 194   <span class="i">$Length</span> = <span class="k">sqrt</span> <span class="i">$DotProduct</span><span class="sc">;</span>
 195 
 196   <span class="k">return</span> <span class="i">$Length</span><span class="sc">;</span>
 197 <span class="s">}</span>
 198 
 199 <span class="c"># Length of a 3D vector by another name...</span>
<a name="GetMagnitude-"></a> 200 <span class="k">sub </span><span class="m">GetMagnitude</span> <span class="s">{</span>
 201   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 202   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 203 <span class="s">}</span>
 204 
 205 <span class="c"># Normalize 3D vector...</span>
<a name="Normalize-"></a> 206 <span class="k">sub </span><span class="m">Normalize</span> <span class="s">{</span>
 207   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 208 
 209   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 210     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetGetLength: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 211   <span class="s">}</span>
 212   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$Length</span><span class="s">)</span><span class="sc">;</span>
 213   <span class="i">$Length</span> = <span class="i">$This</span><span class="i">-&gt;GetLength</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 214   <span class="i">$Vector</span> = <span class="i">$This</span> / <span class="i">$Length</span><span class="sc">;</span>
 215 
 216   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 217 <span class="s">}</span>
 218 
 219 <span class="c"># Is it a vector object?</span>
<a name="IsVector-"></a> 220 <span class="k">sub </span><span class="m">IsVector ($)</span> <span class="s">{</span>
 221   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 222 
 223   <span class="k">return</span> <span class="i">_IsVector</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
 224 <span class="s">}</span>
 225 
 226 <span class="c"># Get size...</span>
<a name="GetSize-"></a> 227 <span class="k">sub </span><span class="m">GetSize</span> <span class="s">{</span>
 228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 229 
 230   <span class="k">return</span> <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 231 <span class="s">}</span>
 232 
 233 <span class="c"># Get X value of a 3D vector...</span>
<a name="GetX-"></a> 234 <span class="k">sub </span><span class="m">GetX</span> <span class="s">{</span>
 235   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 236 
 237   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 238     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetX: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 239   <span class="s">}</span>
 240   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="n">0</span><span class="s">)</span><span class="sc">;</span>
 241 <span class="s">}</span>
 242 
 243 <span class="c"># Set X value of a 3D vector...</span>
<a name="SetX-"></a> 244 <span class="k">sub </span><span class="m">SetX</span> <span class="s">{</span>
 245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 246 
 247   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 248     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetX: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 249   <span class="s">}</span>
 250   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 251 <span class="s">}</span>
 252 
 253 <span class="c"># Get Y value of a 3D vector...</span>
<a name="GetY-"></a> 254 <span class="k">sub </span><span class="m">GetY</span> <span class="s">{</span>
 255   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 256 
 257   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 258     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetY: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 259   <span class="s">}</span>
 260   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 261 <span class="s">}</span>
 262 
 263 <span class="c"># Set Y value of a 3D vector...</span>
<a name="SetY-"></a> 264 <span class="k">sub </span><span class="m">SetY</span> <span class="s">{</span>
 265   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 266 
 267   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 268     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetY: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 269   <span class="s">}</span>
 270   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 271 <span class="s">}</span>
 272 
 273 <span class="c"># Get Z value of a 3D vector...</span>
<a name="GetZ-"></a> 274 <span class="k">sub </span><span class="m">GetZ</span> <span class="s">{</span>
 275   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 276 
 277   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 278     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetZ: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 279   <span class="s">}</span>
 280   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="n">2</span><span class="s">)</span><span class="sc">;</span>
 281 <span class="s">}</span>
 282 
 283 <span class="c"># Set Z value of a 3D vector...</span>
<a name="SetZ-"></a> 284 <span class="k">sub </span><span class="m">SetZ</span> <span class="s">{</span>
 285   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 286 
 287   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 288     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetZ: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 289   <span class="s">}</span>
 290   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="n">2</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 291 <span class="s">}</span>
 292 
 293 <span class="c"># Set XYZ value of a 3D vector using:</span>
 294 <span class="c">#    o List of values</span>
 295 <span class="c">#    o Reference to an list of values</span>
 296 <span class="c">#    o Another vector object</span>
 297 <span class="c">#</span>
<a name="SetXYZ-"></a> 298 <span class="k">sub </span><span class="m">SetXYZ</span> <span class="s">{</span>
 299   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 300 
 301   <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
 302     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: No values specified...&quot;</span><span class="sc">;</span>
 303   <span class="s">}</span>
 304 
 305   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 306     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 307   <span class="s">}</span>
 308 
 309   <span class="c"># Set vector values...</span>
 310   <span class="k">my</span><span class="s">(</span><span class="i">$FirstValue</span><span class="cm">,</span> <span class="i">$TypeOfFirstValue</span><span class="s">)</span><span class="sc">;</span>
 311   <span class="i">$FirstValue</span> = <span class="i">$Values</span>[<span class="n">0</span>]<span class="sc">;</span>
 312   <span class="i">$TypeOfFirstValue</span> = <span class="k">ref</span> <span class="i">$FirstValue</span><span class="sc">;</span>
 313   <span class="k">if</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^(SCALAR|HASH|CODE|REF|GLOB)/</span><span class="s">)</span> <span class="s">{</span>
 314     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: A reference to unsupported value format specified...&quot;</span><span class="sc">;</span>
 315   <span class="s">}</span>
 316 
 317   <span class="k">my</span><span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span>
 318   <span class="k">if</span> <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstValue</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 319     <span class="c"># SetXYZ using vector...</span>
 320     <span class="k">if</span> <span class="s">(</span><span class="i">$FirstValue</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 321       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: Input object must be a 3D vector...&quot;</span><span class="sc">;</span>
 322     <span class="s">}</span>
 323     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$FirstValue</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 324   <span class="s">}</span>
 325   <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfFirstValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
 326     <span class="c"># SetXYZ using array reference...</span>
 327     <span class="k">if</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$FirstValue</span>} != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 328       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: Input array reference must correspond to an array with three values...&quot;</span><span class="sc">;</span>
 329     <span class="s">}</span>
 330     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@</span>{<span class="i">$FirstValue</span>}<span class="sc">;</span>
 331   <span class="s">}</span>
 332   <span class="k">else</span> <span class="s">{</span>
 333     <span class="c"># It&#39;s a list of values...</span>
 334     <span class="k">if</span> <span class="s">(</span><span class="i">@Values</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 335       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetXYZ: Input array must contain three values...&quot;</span><span class="sc">;</span>
 336     <span class="s">}</span>
 337     <span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span> = <span class="i">@Values</span><span class="sc">;</span>
 338   <span class="s">}</span>
 339   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="n">0</span>] = <span class="i">$X</span><span class="sc">;</span>
 340   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="n">1</span>] = <span class="i">$Y</span><span class="sc">;</span>
 341   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="n">2</span>] = <span class="i">$Z</span><span class="sc">;</span>
 342 
 343   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 344 <span class="s">}</span>
 345 
 346 <span class="c"># Get XYZ as an array or a reference to an array...</span>
 347 <span class="c">#</span>
<a name="GetXYZ-"></a> 348 <span class="k">sub </span><span class="m">GetXYZ</span> <span class="s">{</span>
 349   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 350 
 351   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 352     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetXYZ: Object must be a 3D vector...&quot;</span><span class="sc">;</span>
 353   <span class="s">}</span>
 354   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 355 <span class="s">}</span>
 356 
 357 <span class="c"># Get a specific value from vector with indicies starting from 0..</span>
<a name="GetValue-"></a> 358 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span>
 359   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 360 
 361   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &lt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 362     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValue: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 363   <span class="s">}</span>
 364   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 365     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;GetValue: Index value must be less than size of vector...&quot;</span><span class="sc">;</span>
 366   <span class="s">}</span>
 367   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 368 <span class="s">}</span>
 369 
 370 <span class="c"># Get a vector value...</span>
<a name="_GetValue-"></a> 371 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span>
 372   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 373 
 374   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 375 <span class="s">}</span>
 376 
 377 <span class="c"># Set a specific value in vector with indicies starting from 0..</span>
<a name="SetValue-"></a> 378 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span>
 379   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 380 
 381   <span class="c"># Just set it...</span>
 382   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipCheck</span><span class="s">)</span> <span class="s">{</span>
 383     <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 384   <span class="s">}</span>
 385 
 386   <span class="c"># Check and set...</span>
 387   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &lt; <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 388     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValue: Index value must be a positive number...&quot;</span><span class="sc">;</span>
 389   <span class="s">}</span>
 390   <span class="k">if</span> <span class="s">(</span><span class="i">$Index</span> &gt;= <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 391     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetValue: Index vaue must be less than size of vector...&quot;</span><span class="sc">;</span>
 392   <span class="s">}</span>
 393 
 394   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 395 <span class="s">}</span>
 396 
 397 <span class="c"># Set a vector value...</span>
<a name="_SetValue-"></a> 398 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span>
 399   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 400 
 401   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="i">$Value</span><span class="sc">;</span>
 402 
 403   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 404 <span class="s">}</span>
 405 
 406 <span class="c"># Return vector values as an array or reference to an array...</span>
<a name="GetValues-"></a> 407 <span class="k">sub </span><span class="m">GetValues</span> <span class="s">{</span>
 408   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 409 
 410   <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} <span class="co">:</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 411 <span class="s">}</span>
 412 
 413 <span class="c"># Get number of non-zero values in vector...</span>
 414 <span class="c">#</span>
<a name="GetNumOfNonZeroValues-"></a> 415 <span class="k">sub </span><span class="m">GetNumOfNonZeroValues</span> <span class="s">{</span>
 416   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 417   <span class="k">my</span><span class="s">(</span><span class="i">$Count</span><span class="cm">,</span> <span class="i">$Index</span><span class="cm">,</span> <span class="i">$Size</span><span class="s">)</span><span class="sc">;</span>
 418 
 419   <span class="i">$Count</span> = <span class="n">0</span><span class="sc">;</span>
 420   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 421 
 422   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 423     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 424       <span class="i">$Count</span>++<span class="sc">;</span>
 425     <span class="s">}</span>
 426   <span class="s">}</span>
 427   <span class="k">return</span> <span class="i">$Count</span><span class="sc">;</span>
 428 <span class="s">}</span>
 429 
 430 <span class="c"># Get percent of non-zero values...</span>
 431 <span class="c">#</span>
<a name="GetPercentOfNonZeroValues-"></a> 432 <span class="k">sub </span><span class="m">GetPercentOfNonZeroValues</span> <span class="s">{</span>
 433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 434 
 435   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> ? <span class="s">(</span><span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfNonZeroValues</span><span class="s">(</span><span class="s">)</span>/<span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span>*<span class="n">100</span><span class="s">)</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 436 <span class="s">}</span>
 437 
 438 <span class="c"># Set value print format for an individual object or the whole class...</span>
<a name="SetValuePrintFormat-"></a> 439 <span class="k">sub </span><span class="m">SetValuePrintFormat ($;$)</span> <span class="s">{</span>
 440   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 441 
 442   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsVector</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 443     <span class="c"># Set value print format for the specific object...</span>
 444     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 445 
 446     <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
 447   <span class="s">}</span>
 448   <span class="k">else</span> <span class="s">{</span>
 449     <span class="c"># Set value print format for the class...</span>
 450     <span class="k">my</span><span class="s">(</span><span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span>
 451 
 452     <span class="i">$ValueFormat</span> = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
 453   <span class="s">}</span>
 454 <span class="s">}</span>
 455 
 456 <span class="c"># Zero vector of specified size or size 3...</span>
<a name="ZeroVector-"></a> 457 <span class="k">sub </span><span class="m">ZeroVector (;$)</span> <span class="s">{</span>
 458   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 459   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 460 
 461   <span class="i">$Size</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$Size</span><span class="s">)</span> ? <span class="i">$Size</span> <span class="co">:</span> <span class="n">3</span><span class="sc">;</span>
 462   <span class="i">@Values</span> = <span class="s">(</span><span class="q">&#39;0&#39;</span><span class="s">)</span> x <span class="i">$Size</span><span class="sc">;</span>
 463 
 464   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 465   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 466 <span class="s">}</span>
 467 
 468 <span class="c"># Unit vector of specified size or size 3...</span>
<a name="UnitVector-"></a> 469 <span class="k">sub </span><span class="m">UnitVector (;$)</span> <span class="s">{</span>
 470   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 471   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 472 
 473   <span class="i">$Size</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$Size</span><span class="s">)</span> ? <span class="i">$Size</span> <span class="co">:</span> <span class="n">3</span><span class="sc">;</span>
 474   <span class="i">@Values</span> = <span class="s">(</span><span class="q">&#39;1&#39;</span><span class="s">)</span> x <span class="i">$Size</span><span class="sc">;</span>
 475 
 476   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 477   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 478 <span class="s">}</span>
 479 
 480 <span class="c"># Unit X vector of size 3...</span>
<a name="UnitXVector-"></a> 481 <span class="k">sub </span><span class="m">UnitXVector ()</span> <span class="s">{</span>
 482   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span>
 483 
 484   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span>
 485   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 486 <span class="s">}</span>
 487 
 488 <span class="c"># Unit Y vector of size 3...</span>
<a name="UnitYVector-"></a> 489 <span class="k">sub </span><span class="m">UnitYVector ()</span> <span class="s">{</span>
 490   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span>
 491 
 492   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="cm">,</span> <span class="n">0</span><span class="s">)</span><span class="sc">;</span>
 493   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 494 <span class="s">}</span>
 495 
 496 <span class="c"># Unit Z vector of size 3...</span>
<a name="UnitZVector-"></a> 497 <span class="k">sub </span><span class="m">UnitZVector ()</span> <span class="s">{</span>
 498   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="sc">;</span>
 499 
 500   <span class="i">$Vector</span> = <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="n">0</span><span class="cm">,</span> <span class="n">0</span><span class="cm">,</span> <span class="n">1</span><span class="s">)</span><span class="sc">;</span>
 501   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 502 <span class="s">}</span>
 503 
 504 <span class="c">#</span>
 505 <span class="c"># Vector addition operator supports two addition modes:</span>
 506 <span class="c">#   . Addition of two vectors by adding corresponding vector values</span>
 507 <span class="c">#   . Addition of a scalar value to vector values ($Vector + 1)</span>
 508 <span class="c">#</span>
 509 <span class="c"># Caveats:</span>
 510 <span class="c">#   . Addition of a vector to scalar is not allowed (1 + $Vector)</span>
 511 <span class="c">#</span>
<a name="_VectorAdditionOperator-"></a> 512 <span class="k">sub </span><span class="m">_VectorAdditionOperator</span> <span class="s">{</span>
 513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 514 
 515   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorAdditionOperator: Vector addition failed&quot;</span><span class="sc">;</span>
 516   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 517 
 518   <span class="c"># Do the addition. Order can be ignored: It&#39;s a commumative operation.</span>
 519   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 520   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 521   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 522 
 523   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 524     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 525     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 526       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] += <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 527     <span class="s">}</span>
 528   <span class="s">}</span>
 529   <span class="k">else</span> <span class="s">{</span>
 530     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 531       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 532     <span class="s">}</span>
 533     <span class="c"># Scalar addition...</span>
 534     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 535       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] += <span class="i">$Other</span><span class="sc">;</span>
 536     <span class="s">}</span>
 537   <span class="s">}</span>
 538   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 539 <span class="s">}</span>
 540 
 541 <span class="c">#</span>
 542 <span class="c"># Vector subtraction operator supports two subtraction modes:</span>
 543 <span class="c">#   . Subtraction of two vectors by subtracting corresponding vector values</span>
 544 <span class="c">#   . Subtraction of a scalar value from vector values ($Vector - 1)</span>
 545 <span class="c">#</span>
 546 <span class="c"># Caveats:</span>
 547 <span class="c">#   . Subtraction of a vector from scalar is not allowed (1 - $Vector)</span>
 548 <span class="c">#</span>
<a name="_VectorSubtractionOperator-"></a> 549 <span class="k">sub </span><span class="m">_VectorSubtractionOperator</span> <span class="s">{</span>
 550   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 551 
 552   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorSubtractionOperator: Vector subtracttion failed&quot;</span><span class="sc">;</span>
 553   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 554 
 555   <span class="c"># Do the subtraction...</span>
 556   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 557   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 558   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 559 
 560   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 561     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 562     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 563       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] -= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 564     <span class="s">}</span>
 565   <span class="s">}</span>
 566   <span class="k">else</span> <span class="s">{</span>
 567     <span class="c"># Scalar subtraction...</span>
 568     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 569       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 570     <span class="s">}</span>
 571     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 572       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] -= <span class="i">$Other</span><span class="sc">;</span>
 573     <span class="s">}</span>
 574   <span class="s">}</span>
 575   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 576 <span class="s">}</span>
 577 
 578 <span class="c">#</span>
 579 <span class="c"># Vector multiplication operator supports two multiplication modes:</span>
 580 <span class="c">#   . Multiplication of two vectors by multiplying corresponding vector values</span>
 581 <span class="c">#   . Multiplying vector values by a scalar ($Vector * 1)</span>
 582 <span class="c">#</span>
 583 <span class="c"># Caveats:</span>
 584 <span class="c">#   . Multiplication of a scalar by a vector is not allowed (1 * $Vector)</span>
 585 <span class="c">#</span>
<a name="_VectorMultiplicationOperator-"></a> 586 <span class="k">sub </span><span class="m">_VectorMultiplicationOperator</span> <span class="s">{</span>
 587   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 588 
 589   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorMultiplicationOperator: Vector addition failed&quot;</span><span class="sc">;</span>
 590   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 591 
 592   <span class="c"># Do the multiplication...</span>
 593   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 594   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 595   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 596 
 597   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 598     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 599     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 600       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] *= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 601     <span class="s">}</span>
 602   <span class="s">}</span>
 603   <span class="k">else</span> <span class="s">{</span>
 604     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 605       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 606     <span class="s">}</span>
 607     <span class="c"># Scalar multiplication...</span>
 608     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 609       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] *= <span class="i">$Other</span><span class="sc">;</span>
 610     <span class="s">}</span>
 611   <span class="s">}</span>
 612   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 613 <span class="s">}</span>
 614 
 615 <span class="c">#</span>
 616 <span class="c"># Vector division operator supports two division modes:</span>
 617 <span class="c">#   . Division of two vectors by dividing corresponding vector values</span>
 618 <span class="c">#   . Dividing vector values by a scalar ($Vector / 2)</span>
 619 <span class="c">#</span>
 620 <span class="c"># Caveats:</span>
 621 <span class="c">#   . Division of a scalar by a vector is not allowed (1 / $Vector)</span>
 622 <span class="c">#</span>
<a name="_VectorDivisionOperator-"></a> 623 <span class="k">sub </span><span class="m">_VectorDivisionOperator</span> <span class="s">{</span>
 624   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 625 
 626   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorDivisionOperator: Vector division failed&quot;</span><span class="sc">;</span>
 627   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 628 
 629   <span class="c"># Do the division...</span>
 630   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 631   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 632   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 633 
 634   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 635     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 636     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 637       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] /= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 638     <span class="s">}</span>
 639   <span class="s">}</span>
 640   <span class="k">else</span> <span class="s">{</span>
 641     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 642       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 643     <span class="s">}</span>
 644     <span class="c"># Scalar divison...</span>
 645     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 646       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] /=  <span class="i">$Other</span><span class="sc">;</span>
 647     <span class="s">}</span>
 648   <span class="s">}</span>
 649   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 650 <span class="s">}</span>
 651 
 652 <span class="c">#</span>
 653 <span class="c"># Vector exponentiation operator supports two exponentiation modes:</span>
 654 <span class="c">#   . Exponentiation of two vectors by exponentiation of  corresponding vector values</span>
 655 <span class="c">#   . Exponentiation of vector values by a scalar ($Vector ** 2)</span>
 656 <span class="c">#</span>
 657 <span class="c"># Caveats:</span>
 658 <span class="c">#   . Exponent of scalar by a vector is not allowed (2 ** $Vector)</span>
 659 <span class="c">#</span>
<a name="_VectorExponentiationOperator-"></a> 660 <span class="k">sub </span><span class="m">_VectorExponentiationOperator</span> <span class="s">{</span>
 661   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 662 
 663   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorExponentiationOperator: Vector exponentiation failed&quot;</span><span class="sc">;</span>
 664   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 665 
 666   <span class="c"># Do the exponentiation...</span>
 667   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 668   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 669   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 670 
 671   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 672     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 673     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 674       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] **= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 675     <span class="s">}</span>
 676   <span class="s">}</span>
 677   <span class="k">else</span> <span class="s">{</span>
 678     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 679       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 680     <span class="s">}</span>
 681     <span class="c"># Scalar exponentiation...</span>
 682     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 683       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] **=  <span class="i">$Other</span><span class="sc">;</span>
 684     <span class="s">}</span>
 685   <span class="s">}</span>
 686   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 687 <span class="s">}</span>
 688 
 689 <span class="c">#</span>
 690 <span class="c"># Vector modulus operator supports two modulus modes:</span>
 691 <span class="c">#   . Modulus of two vectors by taking modulus between corresponding vector values</span>
 692 <span class="c">#   . Modulus of vector values by a scalar ($Vector % 2)</span>
 693 <span class="c">#</span>
 694 <span class="c"># Caveats:</span>
 695 <span class="c">#   . Modulus of scalar by a vector is not allowed (2 % $Vector)</span>
 696 <span class="c">#</span>
<a name="_VectorModulusOperator-"></a> 697 <span class="k">sub </span><span class="m">_VectorModulusOperator</span> <span class="s">{</span>
 698   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 699 
 700   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorModulusOperator: Vector exponentiation failed&quot;</span><span class="sc">;</span>
 701   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 702 
 703   <span class="c"># Take the modulus...</span>
 704   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 705   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 706   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 707 
 708   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 709     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 710     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 711       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] %= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
 712     <span class="s">}</span>
 713   <span class="s">}</span>
 714   <span class="k">else</span> <span class="s">{</span>
 715     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 716       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 717     <span class="s">}</span>
 718     <span class="c"># Scalar modulus...</span>
 719     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 720       <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] %=  <span class="i">$Other</span><span class="sc">;</span>
 721     <span class="s">}</span>
 722   <span class="s">}</span>
 723   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 724 <span class="s">}</span>
 725 
 726 <span class="c">#</span>
 727 <span class="c"># Vector dot product operator supports two modes:</span>
 728 <span class="c">#   . Dot product of two 3D vectors</span>
 729 <span class="c">#   . Concatenation of a vector and a scalar</span>
 730 <span class="c">#</span>
<a name="_VectorDotProductOperator-"></a> 731 <span class="k">sub </span><span class="m">_VectorDotProductOperator</span> <span class="s">{</span>
 732   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 733 
 734   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorDotProductOperator: Vector dot product failed&quot;</span><span class="sc">;</span>
 735   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 736 
 737   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 738     <span class="c"># Calculate dot product of two 3D vectors...</span>
 739     <span class="k">my</span><span class="s">(</span><span class="i">$DotProduct</span><span class="s">)</span><span class="sc">;</span>
 740     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 741       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Both vectors must be 3D vectors...&quot;</span><span class="sc">;</span>
 742     <span class="s">}</span>
 743     <span class="i">$DotProduct</span> = <span class="i">$This</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetX</span> + <span class="i">$This</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> + <span class="i">$This</span><span class="i">-&gt;GetZ</span> * <span class="i">$Other</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 744     <span class="k">return</span> <span class="i">$DotProduct</span><span class="sc">;</span>
 745   <span class="s">}</span>
 746   <span class="k">else</span> <span class="s">{</span>
 747     <span class="c"># Do a string concatenation and return the string...</span>
 748     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 749       <span class="k">return</span> <span class="i">$Other</span> . <span class="i">$This</span><span class="i">-&gt;StringifyVector</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 750     <span class="s">}</span>
 751     <span class="k">else</span> <span class="s">{</span>
 752       <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;StringifyVector</span><span class="s">(</span><span class="s">)</span> . <span class="i">$Other</span><span class="sc">;</span>
 753     <span class="s">}</span>
 754   <span class="s">}</span>
 755 <span class="s">}</span>
 756 
 757 <span class="c">#</span>
 758 <span class="c"># Vector cross product operator genrates a new vector which is the cross</span>
 759 <span class="c"># product of two 3D vectors.</span>
 760 <span class="c">#</span>
 761 <span class="c"># For two vectors, V1 (X1, Y1, Z1) and V2 (X2, Y2, Z2), cross product</span>
 762 <span class="c"># V1 x V2 corresponds: (Y1.Z2 - Z1.Y2), (Z1.X2 - X1.Z2), (X1.Y2 - Y1.X2)</span>
 763 <span class="c">#</span>
<a name="_VectorCrossProductOperator-"></a> 764 <span class="k">sub </span><span class="m">_VectorCrossProductOperator</span> <span class="s">{</span>
 765   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 766 
 767   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorCrossProductOperator: Vector cross product failed&quot;</span><span class="sc">;</span>
 768   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 769 
 770   <span class="k">if</span> <span class="s">(</span>!<span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 771     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Both object must be vectors...&quot;</span><span class="sc">;</span>
 772   <span class="s">}</span>
 773 
 774   <span class="c"># Calculate cross product of two 3D vectors...</span>
 775   <span class="k">if</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="n">3</span><span class="s">)</span> <span class="s">{</span>
 776     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Both vectors must be 3D vectors...&quot;</span><span class="sc">;</span>
 777   <span class="s">}</span>
 778   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span>
 779   <span class="i">$X</span> = <span class="i">$This</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 780   <span class="i">$Y</span> = <span class="i">$This</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetZ</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 781   <span class="i">$Z</span> = <span class="i">$This</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> - <span class="i">$This</span><span class="i">-&gt;GetY</span><span class="s">(</span><span class="s">)</span> * <span class="i">$Other</span><span class="i">-&gt;GetX</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 782 
 783   <span class="i">$Vector</span> = <span class="s">(</span><span class="k">ref</span> <span class="i">$This</span><span class="s">)</span><span class="i">-&gt;new</span><span class="s">(</span><span class="i">$X</span><span class="cm">,</span> <span class="i">$Y</span><span class="cm">,</span> <span class="i">$Z</span><span class="s">)</span><span class="sc">;</span>
 784 
 785   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
 786 <span class="s">}</span>
 787 
 788 <span class="c">#</span>
 789 <span class="c"># Vector booelan operator checks whether a vector contains at least one non-zero</span>
 790 <span class="c"># value...</span>
 791 <span class="c">#</span>
<a name="_VectorBooleanOperator-"></a> 792 <span class="k">sub </span><span class="m">_VectorBooleanOperator</span> <span class="s">{</span>
 793   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 794 
 795   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorBooleanOperator: Vector boolean operation failed&quot;</span><span class="sc">;</span>
 796   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 797 
 798   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 799   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 800 
 801   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 802     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 803       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 804     <span class="s">}</span>
 805   <span class="s">}</span>
 806   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 807 <span class="s">}</span>
 808 
 809 <span class="c">#</span>
 810 <span class="c"># Vector not booelan operator checks whether all values of a vector are zero.</span>
 811 <span class="c">#</span>
<a name="_VectorNotBooleanOperator-"></a> 812 <span class="k">sub </span><span class="m">_VectorNotBooleanOperator</span> <span class="s">{</span>
 813   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 814 
 815   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorNotBooleanOperator: Vector not boolean operation failed&quot;</span><span class="sc">;</span>
 816   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 817 
 818   <span class="k">my</span><span class="s">(</span><span class="i">$Size</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 819   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 820 
 821   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$Size</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 822     <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="n">0</span><span class="s">)</span> <span class="s">{</span>
 823       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 824     <span class="s">}</span>
 825   <span class="s">}</span>
 826   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 827 <span class="s">}</span>
 828 
 829 <span class="c">#</span>
 830 <span class="c"># Vector equal operator supports two modes:</span>
 831 <span class="c">#   . Comparion of corresponding values in two vectors</span>
 832 <span class="c">#   . Comparing vectors values to a scalar ($Vector == 2)</span>
 833 <span class="c">#</span>
 834 <span class="c"># Caveats:</span>
 835 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 == $Vector)</span>
 836 <span class="c">#</span>
<a name="_VectorEqualOperator-"></a> 837 <span class="k">sub </span><span class="m">_VectorEqualOperator</span> <span class="s">{</span>
 838   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span>
 839 
 840   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorEqualOperator: Vector equal comparison failed&quot;</span><span class="sc">;</span>
 841   <span class="i">$CheckVectorSizes</span> = <span class="n">0</span><span class="sc">;</span>
 842   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span>
 843 
 844   <span class="c"># Do the comparison...</span>
 845   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 846   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 847 
 848   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 849     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 850     <span class="k">my</span><span class="s">(</span><span class="i">$OtherSize</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 851     <span class="k">if</span> <span class="s">(</span><span class="i">$ThisSize</span> != <span class="i">$OtherSize</span><span class="s">)</span> <span class="s">{</span>
 852       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 853     <span class="s">}</span>
 854     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 855       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 856         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 857       <span class="s">}</span>
 858     <span class="s">}</span>
 859   <span class="s">}</span>
 860   <span class="k">else</span> <span class="s">{</span>
 861     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 862       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 863     <span class="s">}</span>
 864     <span class="c"># Scalar comparison...</span>
 865     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 866       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] != <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
 867         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 868       <span class="s">}</span>
 869     <span class="s">}</span>
 870   <span class="s">}</span>
 871   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 872 <span class="s">}</span>
 873 
 874 <span class="c">#</span>
 875 <span class="c"># Vector not equal operator supports two modes:</span>
 876 <span class="c">#   . Comparion of corresponding values in two vectors</span>
 877 <span class="c">#   . Comparing vectors values to a scalar ($Vector != 2)</span>
 878 <span class="c">#</span>
 879 <span class="c"># Caveats:</span>
 880 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 != $Vector2)</span>
 881 <span class="c">#</span>
<a name="_VectorNotEqualOperator-"></a> 882 <span class="k">sub </span><span class="m">_VectorNotEqualOperator</span> <span class="s">{</span>
 883   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span>
 884 
 885   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorNotEqualOperator: Vector not equal comparison failed&quot;</span><span class="sc">;</span>
 886   <span class="i">$CheckVectorSizes</span> = <span class="n">0</span><span class="sc">;</span>
 887   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span>
 888 
 889   <span class="c"># Do the comparison...</span>
 890   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 891   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 892 
 893   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 894     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 895     <span class="k">my</span><span class="s">(</span><span class="i">$OtherSize</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 896     <span class="k">if</span> <span class="s">(</span><span class="i">$ThisSize</span> != <span class="i">$OtherSize</span><span class="s">)</span> <span class="s">{</span>
 897       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 898     <span class="s">}</span>
 899     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 900       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] == <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 901         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 902       <span class="s">}</span>
 903     <span class="s">}</span>
 904   <span class="s">}</span>
 905   <span class="k">else</span> <span class="s">{</span>
 906     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 907       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 908     <span class="s">}</span>
 909     <span class="c"># Scalar comparison...</span>
 910     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 911       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] == <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
 912         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 913       <span class="s">}</span>
 914     <span class="s">}</span>
 915   <span class="s">}</span>
 916   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 917 <span class="s">}</span>
 918 
 919 <span class="c">#</span>
 920 <span class="c"># Vector less than operator supports two modes:</span>
 921 <span class="c">#   . Comparion of corresponding values in two vectors</span>
 922 <span class="c">#   . Comparing vectors values to a scalar ($Vector &lt; 2)</span>
 923 <span class="c">#</span>
 924 <span class="c"># Caveats:</span>
 925 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 &lt; $Vector2)</span>
 926 <span class="c">#</span>
<a name="_VectorLessThanOperator-"></a> 927 <span class="k">sub </span><span class="m">_VectorLessThanOperator</span> <span class="s">{</span>
 928   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 929 
 930   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorLessThanOperator: Vector less than comparison failed&quot;</span><span class="sc">;</span>
 931   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 932 
 933   <span class="c"># Do the comparison...</span>
 934   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 935   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 936 
 937   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 938     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 939     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 940       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &gt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 941         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 942       <span class="s">}</span>
 943     <span class="s">}</span>
 944   <span class="s">}</span>
 945   <span class="k">else</span> <span class="s">{</span>
 946     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 947       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 948     <span class="s">}</span>
 949     <span class="c"># Scalar comparison...</span>
 950     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 951       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &gt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
 952         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 953       <span class="s">}</span>
 954     <span class="s">}</span>
 955   <span class="s">}</span>
 956   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 957 <span class="s">}</span>
 958 
 959 <span class="c">#</span>
 960 <span class="c"># Vector less than equla operator supports two modes:</span>
 961 <span class="c">#   . Comparion of corresponding values in two vectors</span>
 962 <span class="c">#   . Comparing vectors values to a scalar ($Vector &lt;= 2)</span>
 963 <span class="c">#</span>
 964 <span class="c"># Caveats:</span>
 965 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 &lt;= $Vector2)</span>
 966 <span class="c">#</span>
<a name="_VectorLessThanEqualOperator-"></a> 967 <span class="k">sub </span><span class="m">_VectorLessThanEqualOperator</span> <span class="s">{</span>
 968   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
 969 
 970   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorLessThanEqualOperator: Vector less than equal comparison failed&quot;</span><span class="sc">;</span>
 971   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 972 
 973   <span class="c"># Do the comparison...</span>
 974   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
 975   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 976 
 977   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
 978     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
 979     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 980       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &gt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
 981         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 982       <span class="s">}</span>
 983     <span class="s">}</span>
 984   <span class="s">}</span>
 985   <span class="k">else</span> <span class="s">{</span>
 986     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
 987       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
 988     <span class="s">}</span>
 989     <span class="c"># Scalar comparison...</span>
 990     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 991       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &gt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
 992         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 993       <span class="s">}</span>
 994     <span class="s">}</span>
 995   <span class="s">}</span>
 996   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
 997 <span class="s">}</span>
 998 
 999 <span class="c">#</span>
1000 <span class="c"># Vector greatar than operator supports two modes:</span>
1001 <span class="c">#   . Comparion of corresponding values in two vectors</span>
1002 <span class="c">#   . Comparing vectors values to a scalar ($Vector &gt; 2)</span>
1003 <span class="c">#</span>
1004 <span class="c"># Caveats:</span>
1005 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 &gt; $Vector2)</span>
1006 <span class="c">#</span>
<a name="_VectorGreatarThanOperator-"></a>1007 <span class="k">sub </span><span class="m">_VectorGreatarThanOperator</span> <span class="s">{</span>
1008   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1009 
1010   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorGreatarThanOperator: Vector greatar than comparison failed&quot;</span><span class="sc">;</span>
1011   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1012 
1013   <span class="c"># Do the comparison...</span>
1014   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1015   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1016 
1017   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
1018     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
1019     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1020       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &lt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
1021         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1022       <span class="s">}</span>
1023     <span class="s">}</span>
1024   <span class="s">}</span>
1025   <span class="k">else</span> <span class="s">{</span>
1026     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1027       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
1028     <span class="s">}</span>
1029     <span class="c"># Scalar comparison...</span>
1030     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1031       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &lt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
1032         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1033       <span class="s">}</span>
1034     <span class="s">}</span>
1035   <span class="s">}</span>
1036   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1037 <span class="s">}</span>
1038 
1039 <span class="c">#</span>
1040 <span class="c"># Vector greatar than equal operator supports two modes:</span>
1041 <span class="c">#   . Comparion of corresponding values in two vectors</span>
1042 <span class="c">#   . Comparing vectors values to a scalar ($Vector &gt;= 2)</span>
1043 <span class="c">#</span>
1044 <span class="c"># Caveats:</span>
1045 <span class="c">#   . Comparison of a scalar to vector values is not allowed (2 &lt;= $Vector2)</span>
1046 <span class="c">#</span>
<a name="_VectorGreatarThanEqualOperator-"></a>1047 <span class="k">sub </span><span class="m">_VectorGreatarThanEqualOperator</span> <span class="s">{</span>
1048   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1049 
1050   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorGreatarThanEqualOperator: Vector greatar than equal comparison failed&quot;</span><span class="sc">;</span>
1051   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1052 
1053   <span class="c"># Do the comparison...</span>
1054   <span class="k">my</span><span class="s">(</span><span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1055   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1056 
1057   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsVector</span><span class="s">)</span> <span class="s">{</span>
1058     <span class="c"># $OrderFlipped is set to false for two vectors...</span>
1059     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1060       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &lt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="s">)</span> <span class="s">{</span>
1061         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1062       <span class="s">}</span>
1063     <span class="s">}</span>
1064   <span class="s">}</span>
1065   <span class="k">else</span> <span class="s">{</span>
1066     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1067       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a vector...&quot;</span><span class="sc">;</span>
1068     <span class="s">}</span>
1069     <span class="c"># Scalar comparison...</span>
1070     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1071       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] &lt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
1072         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1073       <span class="s">}</span>
1074     <span class="s">}</span>
1075   <span class="s">}</span>
1076   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1077 <span class="s">}</span>
1078 
1079 <span class="c">#</span>
1080 <span class="c"># Vector negative value operator returns a vector with values corresponding to</span>
1081 <span class="c"># negative values of a vector</span>
1082 <span class="c">#</span>
<a name="_VectorNegativeValueOperator-"></a>1083 <span class="k">sub </span><span class="m">_VectorNegativeValueOperator</span> <span class="s">{</span>
1084   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1085 
1086   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorNegativeValueOperator: Vector negative value operation failed&quot;</span><span class="sc">;</span>
1087   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1088 
1089   <span class="c"># Take the negative value...</span>
1090   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1091   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1092   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1093 
1094   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1095     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = - <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1096   <span class="s">}</span>
1097   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1098 <span class="s">}</span>
1099 
1100 <span class="c">#</span>
1101 <span class="c"># Vector absolute value operator returns a vector with values corresponding to</span>
1102 <span class="c"># absolute values of a vector</span>
1103 <span class="c">#</span>
<a name="_VectorAbsoluteValueOperator-"></a>1104 <span class="k">sub </span><span class="m">_VectorAbsoluteValueOperator</span> <span class="s">{</span>
1105   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1106 
1107   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorAbsoluteValueOperator: Vector absolute value operation failed&quot;</span><span class="sc">;</span>
1108   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1109 
1110   <span class="c"># Take the absolute value...</span>
1111   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1112   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1113   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1114 
1115   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1116     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">abs</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1117   <span class="s">}</span>
1118   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1119 <span class="s">}</span>
1120 
1121 <span class="c">#</span>
1122 <span class="c"># Vector exp natural base operator returns a vector with values corresponding to</span>
1123 <span class="c"># e raised to the power of values in a vector</span>
1124 <span class="c">#</span>
<a name="_VectorExpNaturalBaseOperator-"></a>1125 <span class="k">sub </span><span class="m">_VectorExpNaturalBaseOperator</span> <span class="s">{</span>
1126   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1127 
1128   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorExpNaturalBaseOperator: Vector exp operation failed&quot;</span><span class="sc">;</span>
1129   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1130 
1131   <span class="c"># Take the absolute value...</span>
1132   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1133   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1134   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1135 
1136   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1137     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">exp</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1138   <span class="s">}</span>
1139   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1140 <span class="s">}</span>
1141 
1142 <span class="c">#</span>
1143 <span class="c"># Vector log natural base operator returns a vector with values corresponding to</span>
1144 <span class="c"># log of values in a vector</span>
1145 <span class="c">#</span>
<a name="_VectorLogNaturalBaseOperator-"></a>1146 <span class="k">sub </span><span class="m">_VectorLogNaturalBaseOperator</span> <span class="s">{</span>
1147   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1148 
1149   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorLogNaturalBaseOperator: Vector log operation failed&quot;</span><span class="sc">;</span>
1150   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1151 
1152   <span class="c"># Take the absolute value...</span>
1153   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1154   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1155   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1156 
1157   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1158     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">log</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1159   <span class="s">}</span>
1160   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1161 <span class="s">}</span>
1162 
1163 <span class="c">#</span>
1164 <span class="c"># Vector cosine operator returns a vector with values corresponding to cosine of values</span>
1165 <span class="c"># in a vector. Input vector values are assumed to be in radians.</span>
1166 <span class="c">#</span>
<a name="_VectorCosineOperator-"></a>1167 <span class="k">sub </span><span class="m">_VectorCosineOperator</span> <span class="s">{</span>
1168   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1169 
1170   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorCosineOperator: Vector cos operation failed&quot;</span><span class="sc">;</span>
1171   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1172 
1173   <span class="c"># Take the absolute value...</span>
1174   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1175   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1176   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1177 
1178   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1179     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">cos</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1180   <span class="s">}</span>
1181   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1182 <span class="s">}</span>
1183 
1184 <span class="c">#</span>
1185 <span class="c"># Vector sine operator returns a vector with values corresponding to sine of values</span>
1186 <span class="c"># in a vector. Input vector values are assumed to be in radians.</span>
1187 <span class="c">#</span>
<a name="_VectorSineOperator-"></a>1188 <span class="k">sub </span><span class="m">_VectorSineOperator</span> <span class="s">{</span>
1189   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1190 
1191   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorSineOperator: Vector sin operation failed&quot;</span><span class="sc">;</span>
1192   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1193 
1194   <span class="c"># Take the absolute value...</span>
1195   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1196   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1197   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1198 
1199   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1200     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">sin</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1201   <span class="s">}</span>
1202   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1203 <span class="s">}</span>
1204 
1205 <span class="c">#</span>
1206 <span class="c"># Vector square root  returns a vector with values corresponding to sqrt of values</span>
1207 <span class="c"># in a vector.</span>
1208 <span class="c">#</span>
<a name="_VectorSquareRootOperator-"></a>1209 <span class="k">sub </span><span class="m">_VectorSquareRootOperator</span> <span class="s">{</span>
1210   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1211 
1212   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_VectorSquareRootOperator: Vector sqrt operation failed&quot;</span><span class="sc">;</span>
1213   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1214 
1215   <span class="c"># Take the absolute value...</span>
1216   <span class="k">my</span><span class="s">(</span><span class="i">$Vector</span><span class="cm">,</span> <span class="i">$ThisSize</span><span class="cm">,</span> <span class="i">$Index</span><span class="s">)</span><span class="sc">;</span>
1217   <span class="i">$Vector</span> = <span class="i">$This</span><span class="i">-&gt;Copy</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1218   <span class="i">$ThisSize</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1219 
1220   <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$ThisSize</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1221     <span class="i">$Vector</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>] = <span class="k">sqrt</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$Index</span>]<span class="sc">;</span>
1222   <span class="s">}</span>
1223   <span class="k">return</span> <span class="i">$Vector</span><span class="sc">;</span>
1224 <span class="s">}</span>
1225 
1226 <span class="c"># Turn vector into array for @{$Vector} operation...</span>
<a name="_VectorToArrayOperator-"></a>1227 <span class="k">sub </span><span class="m">_VectorToArrayOperator</span> <span class="s">{</span>
1228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1229 
1230   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
1231 <span class="s">}</span>
1232 
1233 <span class="c"># Turn vector into number for $#Vector operation: It&#39;s the size of vector...</span>
<a name="_NumifyVector-"></a>1234 <span class="k">sub </span><span class="m">_NumifyVector</span> <span class="s">{</span>
1235   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1236 
1237   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1238 <span class="s">}</span>
1239 
1240 <span class="c"># Process parameters passed to overloaded operators...</span>
1241 <span class="c">#</span>
1242 <span class="c"># For uninary operators, $SecondParameter is not defined.</span>
<a name="_ProcessOverloadedOperatorParameters-"></a>1243 <span class="k">sub </span><span class="m">_ProcessOverloadedOperatorParameters</span> <span class="s">{</span>
1244   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ParametersOrderStatus</span><span class="cm">,</span> <span class="i">$CheckVectorSizesStatus</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1245   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="cm">,</span> <span class="i">$CheckVectorSizes</span><span class="s">)</span><span class="sc">;</span>
1246 
1247   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> =  <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
1248   <span class="i">$OrderFlipped</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ParametersOrderStatus</span><span class="s">)</span> &amp;&amp; <span class="i">$ParametersOrderStatus</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1249   <span class="i">$CheckVectorSizes</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$CheckVectorSizesStatus</span><span class="s">)</span> ? <span class="i">$CheckVectorSizesStatus</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
1250 
1251   <span class="i">_ValidateVector</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
1252 
1253   <span class="i">$OtherIsVector</span> = <span class="n">0</span><span class="sc">;</span>
1254   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="k">ref</span> <span class="i">$Other</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1255     <span class="c"># Make sure $Other is a vector...</span>
1256     <span class="i">_ValidateVector</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
1257     <span class="k">if</span> <span class="s">(</span><span class="i">$CheckVectorSizes</span><span class="s">)</span> <span class="s">{</span>
1258       <span class="i">_ValidateVectorSizesAreEqual</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
1259     <span class="s">}</span>
1260     <span class="i">$OtherIsVector</span> = <span class="n">1</span><span class="sc">;</span>
1261   <span class="s">}</span>
1262   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsVector</span><span class="s">)</span><span class="sc">;</span>
1263 <span class="s">}</span>
1264 
1265 <span class="c"># Is it a vector object?</span>
<a name="_IsVector-"></a>1266 <span class="k">sub </span><span class="m">_IsVector</span> <span class="s">{</span>
1267   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1268 
1269   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1270 <span class="s">}</span>
1271 
1272 <span class="c"># Make sure it&#39;s a vector reference...</span>
<a name="_ValidateVector-"></a>1273 <span class="k">sub </span><span class="m">_ValidateVector</span> <span class="s">{</span>
1274   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Vector</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1275 
1276   <span class="k">if</span> <span class="s">(</span>!<span class="i">_IsVector</span><span class="s">(</span><span class="i">$Vector</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1277     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Object must be a vector...&quot;</span><span class="sc">;</span>
1278   <span class="s">}</span>
1279 <span class="s">}</span>
1280 
1281 <span class="c"># Make sure size of the two vectors contain the same number of values...</span>
<a name="_ValidateVectorSizesAreEqual-"></a>1282 <span class="k">sub </span><span class="m">_ValidateVectorSizesAreEqual</span> <span class="s">{</span>
1283   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Vector1</span><span class="cm">,</span> <span class="i">$Vector2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1284 
1285   <span class="k">if</span> <span class="s">(</span><span class="i">$Vector1</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span> != <span class="i">$Vector2</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1286     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Size of the vectors must be same...&quot;</span><span class="sc">;</span>
1287   <span class="s">}</span>
1288 <span class="s">}</span>
1289 
1290 <span class="c"># Return a string containing vector values...</span>
<a name="StringifyVector-"></a>1291 <span class="k">sub </span><span class="m">StringifyVector</span> <span class="s">{</span>
1292   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1293   <span class="k">my</span><span class="s">(</span><span class="i">$VectorString</span><span class="cm">,</span> <span class="i">$FormatString</span><span class="cm">,</span> <span class="i">$PrintFormat</span><span class="cm">,</span> <span class="i">$Size</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="s">)</span><span class="sc">;</span>
1294 
1295   <span class="i">$PrintFormat</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} <span class="co">:</span> <span class="i">$ValueFormat</span><span class="sc">;</span>
1296 
1297   <span class="i">@ValuesFormat</span> = <span class="s">(</span><span class="i">$PrintFormat</span><span class="s">)</span> x <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
1298   <span class="i">$FormatString</span> = <span class="k">join</span> <span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="sc">;</span>
1299 
1300   <span class="i">$Size</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1301 
1302   <span class="i">$VectorString</span> = <span class="k">sprintf</span> <span class="q">&quot;&lt;Size: $Size; Values: [ $FormatString ] &gt;&quot;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
1303 
1304   <span class="k">return</span> <span class="i">$VectorString</span><span class="sc">;</span>
1305 <span class="s">}</span>
1306 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>