diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/Vector.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,1327 @@
+<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>