Sophie

Sophie

distrib > Fedora > 13 > i386 > media > os > by-pkgid > ecbd8c5b7568e331fe6ea5b9a07a78a0 > files > 8

CCfits-docs-2.2-2.fc13.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>CCfits: ColumnVectorData.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div class="tabs">
    <ul>
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
    </ul>
  </div>
<h1>ColumnVectorData.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">//   Read the documentation to learn more about C++ code generator</span>
<a name="l00002"></a>00002 <span class="comment">//   versioning.</span>
<a name="l00003"></a>00003 <span class="comment">//      This is version 2.2 release dated Sep 2009</span>
<a name="l00004"></a>00004 <span class="comment">//      Astrophysics Science Division,</span>
<a name="l00005"></a>00005 <span class="comment">//      NASA/ Goddard Space Flight Center</span>
<a name="l00006"></a>00006 <span class="comment">//      HEASARC</span>
<a name="l00007"></a>00007 <span class="comment">//      http://heasarc.gsfc.nasa.gov</span>
<a name="l00008"></a>00008 <span class="comment">//      e-mail: ccfits@legacy.gsfc.nasa.gov</span>
<a name="l00009"></a>00009 <span class="comment">//</span>
<a name="l00010"></a>00010 <span class="comment">//      Original author: Ben Dorman</span>
<a name="l00011"></a>00011 
<a name="l00012"></a>00012 <span class="preprocessor">#ifndef COLUMNVECTORDATA_H</span>
<a name="l00013"></a>00013 <span class="preprocessor"></span><span class="preprocessor">#define COLUMNVECTORDATA_H 1</span>
<a name="l00014"></a>00014 <span class="preprocessor"></span><span class="preprocessor">#ifdef _MSC_VER</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span><span class="preprocessor">#include &quot;MSconfig.h&quot;</span>
<a name="l00016"></a>00016 <span class="preprocessor">#endif</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span><span class="preprocessor">#include &quot;CCfits.h&quot;</span>
<a name="l00018"></a>00018 
<a name="l00019"></a>00019 <span class="comment">// valarray</span>
<a name="l00020"></a>00020 <span class="preprocessor">#include &lt;valarray&gt;</span>
<a name="l00021"></a>00021 <span class="comment">// vector</span>
<a name="l00022"></a>00022 <span class="preprocessor">#include &lt;vector&gt;</span>
<a name="l00023"></a>00023 <span class="comment">// Column</span>
<a name="l00024"></a>00024 <span class="preprocessor">#include &quot;Column.h&quot;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#ifdef HAVE_CONFIG_H</span>
<a name="l00026"></a>00026 <span class="preprocessor"></span><span class="preprocessor">#include &quot;config.h&quot;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#endif</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00030"></a>00030 <span class="preprocessor"></span><span class="preprocessor">#include &lt;strstream&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#else</span>
<a name="l00032"></a>00032 <span class="preprocessor"></span><span class="preprocessor">#include &lt;sstream&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#endif</span>
<a name="l00034"></a>00034 <span class="preprocessor"></span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;memory&gt;</span>
<a name="l00036"></a>00036 <span class="preprocessor">#include &lt;numeric&gt;</span>
<a name="l00037"></a>00037 <span class="keyword">namespace </span>CCfits {
<a name="l00038"></a>00038 
<a name="l00039"></a>00039         <span class="keyword">class </span>Table;
<a name="l00040"></a>00040 
<a name="l00041"></a>00041 }
<a name="l00042"></a>00042 
<a name="l00043"></a>00043 <span class="preprocessor">#include &quot;FITS.h&quot;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &quot;FITSUtil.h&quot;</span>
<a name="l00045"></a>00045 <span class="keyword">using</span> std::complex;
<a name="l00046"></a>00046 
<a name="l00047"></a>00047 
<a name="l00048"></a>00048 <span class="keyword">namespace </span>CCfits {
<a name="l00049"></a>00049 
<a name="l00050"></a>00050 
<a name="l00051"></a>00051 
<a name="l00052"></a>00052   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00053"></a>00053   <span class="keyword">class </span>ColumnVectorData : <span class="keyword">public</span> Column  <span class="comment">//## Inherits: &lt;unnamed&gt;%38BAD1D4D370</span>
<a name="l00054"></a>00054   {
<a name="l00055"></a>00055 
<a name="l00056"></a>00056     <span class="keyword">public</span>:
<a name="l00057"></a>00057         ColumnVectorData(<span class="keyword">const</span> ColumnVectorData&lt; T &gt; &amp;right);
<a name="l00058"></a>00058         ColumnVectorData (Table* p = 0);
<a name="l00059"></a>00059         ColumnVectorData (<span class="keywordtype">int</span> columnIndex, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;columnName, ValueType type, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;format, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;unit, Table* p, <span class="keywordtype">int</span>  rpt = 1, <span class="keywordtype">long</span> w = 1, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;comment = <span class="stringliteral">&quot;&quot;</span>);
<a name="l00060"></a>00060         ~ColumnVectorData();
<a name="l00061"></a>00061 
<a name="l00062"></a>00062         <span class="keyword">virtual</span> <span class="keywordtype">void</span> readData (<span class="keywordtype">long</span> firstrow, <span class="keywordtype">long</span> nelements, <span class="keywordtype">long</span> firstelem = 1);
<a name="l00063"></a>00063         <span class="keyword">virtual</span> ColumnVectorData&lt;T&gt;* clone () <span class="keyword">const</span>;
<a name="l00064"></a>00064         <span class="keyword">virtual</span> <span class="keywordtype">void</span> setDimen ();
<a name="l00065"></a>00065         <span class="keywordtype">void</span> setDataLimits (T* limits);
<a name="l00066"></a>00066         <span class="keyword">const</span> T minLegalValue () <span class="keyword">const</span>;
<a name="l00067"></a>00067         <span class="keywordtype">void</span> minLegalValue (T value);
<a name="l00068"></a>00068         <span class="keyword">const</span> T maxLegalValue () <span class="keyword">const</span>;
<a name="l00069"></a>00069         <span class="keywordtype">void</span> maxLegalValue (T value);
<a name="l00070"></a>00070         <span class="keyword">const</span> T minDataValue () <span class="keyword">const</span>;
<a name="l00071"></a>00071         <span class="keywordtype">void</span> minDataValue (T value);
<a name="l00072"></a>00072         <span class="keyword">const</span> T maxDataValue () <span class="keyword">const</span>;
<a name="l00073"></a>00073         <span class="keywordtype">void</span> maxDataValue (T value);
<a name="l00074"></a>00074         <span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; data () <span class="keyword">const</span>;
<a name="l00075"></a>00075         <span class="keywordtype">void</span> setData (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; value);
<a name="l00076"></a>00076         <span class="keyword">const</span> std::valarray&lt;T&gt;&amp; data (<span class="keywordtype">int</span> i) <span class="keyword">const</span>;
<a name="l00077"></a>00077         <span class="keywordtype">void</span> data (<span class="keywordtype">int</span> i, <span class="keyword">const</span> std::valarray&lt;T&gt;&amp; value);
<a name="l00078"></a>00078 
<a name="l00079"></a>00079       <span class="comment">// Additional Public Declarations</span>
<a name="l00080"></a>00080         <span class="keyword">friend</span> <span class="keyword">class </span><a class="code" href="classCCfits_1_1Column.html#a01cd84a7155888aadc568231f908bd5e" title="copy constructor, used in copying Columns to standard library containers.">Column</a>;
<a name="l00081"></a>00081     <span class="keyword">protected</span>:
<a name="l00082"></a>00082       <span class="comment">// Additional Protected Declarations</span>
<a name="l00083"></a>00083 
<a name="l00084"></a>00084     <span class="keyword">private</span>:
<a name="l00085"></a>00085         ColumnVectorData&lt; T &gt; &amp; operator=(<span class="keyword">const</span> ColumnVectorData&lt; T &gt; &amp;right);
<a name="l00086"></a>00086 
<a name="l00087"></a>00087         <span class="keyword">virtual</span> <span class="keywordtype">bool</span> compare (<span class="keyword">const</span> Column &amp;right) <span class="keyword">const</span>;
<a name="l00088"></a>00088         <span class="keywordtype">void</span> resizeDataObject (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; indata, <span class="keywordtype">size_t</span> firstRow);
<a name="l00089"></a>00089         <span class="comment">//      Reads a specified number of column rows.</span>
<a name="l00090"></a>00090         <span class="comment">//</span>
<a name="l00091"></a>00091         <span class="comment">//      There are no default arguments. The function</span>
<a name="l00092"></a>00092         <span class="comment">//      Column::read(firstrow,firstelem,nelements)</span>
<a name="l00093"></a>00093         <span class="comment">//       is designed for reading the whole column.</span>
<a name="l00094"></a>00094         <span class="keyword">virtual</span> <span class="keywordtype">void</span> readColumnData (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> last, T* nullValue = 0);
<a name="l00095"></a>00095         <span class="keyword">virtual</span> std::ostream&amp; put (std::ostream&amp; s) <span class="keyword">const</span>;
<a name="l00096"></a>00096         <span class="keywordtype">void</span> writeData (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; indata, <span class="keywordtype">long</span> numRows, <span class="keywordtype">long</span> firstRow = 1, T* nullValue = 0);
<a name="l00097"></a>00097         <span class="keywordtype">void</span> writeData (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; indata, <span class="keywordtype">long</span> firstRow = 1, T* nullValue = 0);
<a name="l00098"></a>00098         <span class="comment">//      Reads a specified number of column rows.</span>
<a name="l00099"></a>00099         <span class="comment">//</span>
<a name="l00100"></a>00100         <span class="comment">//      There are no default arguments. The function</span>
<a name="l00101"></a>00101         <span class="comment">//      Column::read(firstrow,firstelem,nelements)</span>
<a name="l00102"></a>00102         <span class="comment">//       is designed for reading the whole column.</span>
<a name="l00103"></a>00103         <span class="keyword">virtual</span> <span class="keywordtype">void</span> readRow (<span class="keywordtype">size_t</span> row, T* nullValue = 0);
<a name="l00104"></a>00104         <span class="comment">//      Reads a variable row..</span>
<a name="l00105"></a>00105         <span class="keyword">virtual</span> <span class="keywordtype">void</span> readVariableRow (<span class="keywordtype">size_t</span> row, T* nullValue = 0);
<a name="l00106"></a>00106         <span class="keywordtype">void</span> readColumnData (<span class="keywordtype">long</span> firstrow, <span class="keywordtype">long</span> nelements, <span class="keywordtype">long</span> firstelem, T* nullValue = 0);
<a name="l00107"></a>00107         <span class="keywordtype">void</span> writeData (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; indata, <span class="keyword">const</span> std::vector&lt;long&gt;&amp; vectorLengths, <span class="keywordtype">long</span> firstRow = 1, T* nullValue = 0);
<a name="l00108"></a>00108         <span class="keywordtype">void</span> writeFixedRow (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> firstElem = 1, T* nullValue = 0);
<a name="l00109"></a>00109         <span class="keywordtype">void</span> writeFixedArray (T* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, T* nullValue = 0);
<a name="l00110"></a>00110         <span class="comment">//      Insert one or more blank rows into a FITS column.</span>
<a name="l00111"></a>00111         <span class="keyword">virtual</span> <span class="keywordtype">void</span> insertRows (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> number = 1);
<a name="l00112"></a>00112         <span class="keyword">virtual</span> <span class="keywordtype">void</span> deleteRows (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> number = 1);
<a name="l00113"></a>00113         <span class="keywordtype">void</span> doWrite (T* array, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, T* nullValue);
<a name="l00114"></a>00114 
<a name="l00115"></a>00115       <span class="comment">// Additional Private Declarations</span>
<a name="l00116"></a>00116 
<a name="l00117"></a>00117     <span class="keyword">private</span>: <span class="comment">//## implementation</span>
<a name="l00118"></a>00118       <span class="comment">// Data Members for Class Attributes</span>
<a name="l00119"></a>00119         T m_minLegalValue;
<a name="l00120"></a>00120         T m_maxLegalValue;
<a name="l00121"></a>00121         T m_minDataValue;
<a name="l00122"></a>00122         T m_maxDataValue;
<a name="l00123"></a>00123 
<a name="l00124"></a>00124       <span class="comment">// Data Members for Associations</span>
<a name="l00125"></a>00125         std::vector&lt;std::valarray&lt;T&gt; &gt; m_data;
<a name="l00126"></a>00126 
<a name="l00127"></a>00127       <span class="comment">// Additional Implementation Declarations</span>
<a name="l00128"></a>00128 
<a name="l00129"></a>00129   };
<a name="l00130"></a>00130 
<a name="l00131"></a>00131   <span class="comment">// Parameterized Class CCfits::ColumnVectorData </span>
<a name="l00132"></a>00132 
<a name="l00133"></a>00133   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00134"></a>00134   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::readData (<span class="keywordtype">long</span> firstrow, <span class="keywordtype">long</span> nelements, <span class="keywordtype">long</span> firstelem)
<a name="l00135"></a>00135   {
<a name="l00136"></a>00136     readColumnData(firstrow,nelements,firstelem,static_cast&lt;T*&gt;(0));
<a name="l00137"></a>00137   }
<a name="l00138"></a>00138 
<a name="l00139"></a>00139   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00140"></a>00140   <span class="keyword">inline</span> <span class="keyword">const</span> T ColumnVectorData&lt;T&gt;::minLegalValue ()<span class="keyword"> const</span>
<a name="l00141"></a>00141 <span class="keyword">  </span>{
<a name="l00142"></a>00142     <span class="keywordflow">return</span> m_minLegalValue;
<a name="l00143"></a>00143   }
<a name="l00144"></a>00144 
<a name="l00145"></a>00145   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00146"></a>00146   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::minLegalValue (T value)
<a name="l00147"></a>00147   {
<a name="l00148"></a>00148     m_minLegalValue = value;
<a name="l00149"></a>00149   }
<a name="l00150"></a>00150 
<a name="l00151"></a>00151   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00152"></a>00152   <span class="keyword">inline</span> <span class="keyword">const</span> T ColumnVectorData&lt;T&gt;::maxLegalValue ()<span class="keyword"> const</span>
<a name="l00153"></a>00153 <span class="keyword">  </span>{
<a name="l00154"></a>00154     <span class="keywordflow">return</span> m_maxLegalValue;
<a name="l00155"></a>00155   }
<a name="l00156"></a>00156 
<a name="l00157"></a>00157   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00158"></a>00158   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::maxLegalValue (T value)
<a name="l00159"></a>00159   {
<a name="l00160"></a>00160     m_maxLegalValue = value;
<a name="l00161"></a>00161   }
<a name="l00162"></a>00162 
<a name="l00163"></a>00163   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00164"></a>00164   <span class="keyword">inline</span> <span class="keyword">const</span> T ColumnVectorData&lt;T&gt;::minDataValue ()<span class="keyword"> const</span>
<a name="l00165"></a>00165 <span class="keyword">  </span>{
<a name="l00166"></a>00166     <span class="keywordflow">return</span> m_minDataValue;
<a name="l00167"></a>00167   }
<a name="l00168"></a>00168 
<a name="l00169"></a>00169   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00170"></a>00170   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::minDataValue (T value)
<a name="l00171"></a>00171   {
<a name="l00172"></a>00172     m_minDataValue = value;
<a name="l00173"></a>00173   }
<a name="l00174"></a>00174 
<a name="l00175"></a>00175   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00176"></a>00176   <span class="keyword">inline</span> <span class="keyword">const</span> T ColumnVectorData&lt;T&gt;::maxDataValue ()<span class="keyword"> const</span>
<a name="l00177"></a>00177 <span class="keyword">  </span>{
<a name="l00178"></a>00178     <span class="keywordflow">return</span> m_maxDataValue;
<a name="l00179"></a>00179   }
<a name="l00180"></a>00180 
<a name="l00181"></a>00181   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00182"></a>00182   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::maxDataValue (T value)
<a name="l00183"></a>00183   {
<a name="l00184"></a>00184     m_maxDataValue = value;
<a name="l00185"></a>00185   }
<a name="l00186"></a>00186 
<a name="l00187"></a>00187   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00188"></a>00188   <span class="keyword">inline</span> <span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; ColumnVectorData&lt;T&gt;::data ()<span class="keyword"> const</span>
<a name="l00189"></a>00189 <span class="keyword">  </span>{
<a name="l00190"></a>00190     <span class="keywordflow">return</span> m_data;
<a name="l00191"></a>00191   }
<a name="l00192"></a>00192 
<a name="l00193"></a>00193   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00194"></a>00194   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::setData (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; value)
<a name="l00195"></a>00195   {
<a name="l00196"></a>00196     m_data = value;
<a name="l00197"></a>00197   }
<a name="l00198"></a>00198 
<a name="l00199"></a>00199   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00200"></a>00200   <span class="keyword">inline</span> <span class="keyword">const</span> std::valarray&lt;T&gt;&amp; ColumnVectorData&lt;T&gt;::data (<span class="keywordtype">int</span> i)<span class="keyword"> const</span>
<a name="l00201"></a>00201 <span class="keyword">  </span>{
<a name="l00202"></a>00202     <span class="keywordflow">return</span> m_data[i - 1];
<a name="l00203"></a>00203   }
<a name="l00204"></a>00204 
<a name="l00205"></a>00205   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00206"></a>00206   <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::data (<span class="keywordtype">int</span> i, <span class="keyword">const</span> std::valarray&lt;T&gt;&amp; value)
<a name="l00207"></a>00207   {
<a name="l00208"></a>00208      <span class="keywordflow">if</span> (m_data[i-1].size() != value.size())
<a name="l00209"></a>00209         m_data[i-1].resize(value.size());
<a name="l00210"></a>00210      m_data[i - 1] = value;
<a name="l00211"></a>00211   }
<a name="l00212"></a>00212 
<a name="l00213"></a>00213   <span class="comment">// Parameterized Class CCfits::ColumnVectorData </span>
<a name="l00214"></a>00214 
<a name="l00215"></a>00215   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00216"></a>00216   ColumnVectorData&lt;T&gt;::ColumnVectorData(<span class="keyword">const</span> ColumnVectorData&lt;T&gt; &amp;right)
<a name="l00217"></a>00217       :Column(right),
<a name="l00218"></a>00218        m_minLegalValue(right.m_minLegalValue),
<a name="l00219"></a>00219        m_maxLegalValue(right.m_maxLegalValue),
<a name="l00220"></a>00220        m_minDataValue(right.m_minDataValue),
<a name="l00221"></a>00221        m_maxDataValue(right.m_maxDataValue),
<a name="l00222"></a>00222        m_data(right.m_data)
<a name="l00223"></a>00223   {
<a name="l00224"></a>00224   }
<a name="l00225"></a>00225 
<a name="l00226"></a>00226   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00227"></a>00227   ColumnVectorData&lt;T&gt;::ColumnVectorData (Table* p)
<a name="l00228"></a>00228     : Column(p),
<a name="l00229"></a>00229        m_minLegalValue(0),
<a name="l00230"></a>00230        m_maxLegalValue(0),
<a name="l00231"></a>00231        m_minDataValue(0),
<a name="l00232"></a>00232        m_maxDataValue(0),
<a name="l00233"></a>00233        m_data() 
<a name="l00234"></a>00234   {
<a name="l00235"></a>00235   }
<a name="l00236"></a>00236 
<a name="l00237"></a>00237   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00238"></a>00238   ColumnVectorData&lt;T&gt;::ColumnVectorData (<span class="keywordtype">int</span> columnIndex, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;columnName, ValueType type, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;format, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;unit, Table* p, <span class="keywordtype">int</span>  rpt, <span class="keywordtype">long</span> w, <span class="keyword">const</span> <span class="keywordtype">string</span> &amp;comment)
<a name="l00239"></a>00239         : Column(columnIndex,columnName,type,format,unit,p,rpt,w,comment),
<a name="l00240"></a>00240           m_minLegalValue(0),
<a name="l00241"></a>00241           m_maxLegalValue(0),
<a name="l00242"></a>00242           m_minDataValue(0),
<a name="l00243"></a>00243           m_maxDataValue(0), 
<a name="l00244"></a>00244           m_data()
<a name="l00245"></a>00245   {
<a name="l00246"></a>00246   }
<a name="l00247"></a>00247 
<a name="l00248"></a>00248 
<a name="l00249"></a>00249   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00250"></a>00250   ColumnVectorData&lt;T&gt;::~ColumnVectorData()
<a name="l00251"></a>00251   {
<a name="l00252"></a>00252   <span class="comment">// valarray destructor should do all the work.</span>
<a name="l00253"></a>00253   }
<a name="l00254"></a>00254 
<a name="l00255"></a>00255 
<a name="l00256"></a>00256   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00257"></a>00257   <span class="keywordtype">bool</span> ColumnVectorData&lt;T&gt;::compare (<span class="keyword">const</span> Column &amp;right)<span class="keyword"> const</span>
<a name="l00258"></a>00258 <span class="keyword">  </span>{
<a name="l00259"></a>00259           <span class="keywordflow">if</span> ( !Column::compare(right) ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00260"></a>00260           <span class="keyword">const</span> ColumnVectorData&lt;T&gt;&amp; that = <span class="keyword">static_cast&lt;</span><span class="keyword">const </span>ColumnVectorData&lt;T&gt;&amp;<span class="keyword">&gt;</span>(right);
<a name="l00261"></a>00261           <span class="keywordtype">size_t</span> n = m_data.size();
<a name="l00262"></a>00262           <span class="comment">// m_data is of type valarray&lt;T&gt;.</span>
<a name="l00263"></a>00263           <span class="keywordflow">if</span> ( that.m_data.size() != n ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00264"></a>00264           <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i = 0; i &lt; n ; i++)
<a name="l00265"></a>00265           {
<a name="l00266"></a>00266                 <span class="keywordtype">size_t</span> nn = m_data[i].size();
<a name="l00267"></a>00267                 <span class="comment">// first check size (also, == on 2 valarrays is only defined if they</span>
<a name="l00268"></a>00268                 <span class="comment">// are equal in size).</span>
<a name="l00269"></a>00269                 <span class="keywordflow">if</span> (that.m_data[i].size() != nn ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00270"></a>00270 
<a name="l00271"></a>00271                 std::valarray&lt;bool&gt; test = (m_data[i] == that.m_data[i]);
<a name="l00272"></a>00272                 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j &lt; nn ; j++ ) <span class="keywordflow">if</span> ( !test[j] ) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00273"></a>00273           }
<a name="l00274"></a>00274           <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00275"></a>00275   }
<a name="l00276"></a>00276 
<a name="l00277"></a>00277   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00278"></a>00278   ColumnVectorData&lt;T&gt;* ColumnVectorData&lt;T&gt;::clone ()<span class="keyword"> const</span>
<a name="l00279"></a>00279 <span class="keyword">  </span>{
<a name="l00280"></a>00280   <span class="keywordflow">return</span> <span class="keyword">new</span> ColumnVectorData&lt;T&gt;(*this);
<a name="l00281"></a>00281   }
<a name="l00282"></a>00282 
<a name="l00283"></a>00283   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00284"></a>00284   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::resizeDataObject (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; indata, <span class="keywordtype">size_t</span> firstRow)
<a name="l00285"></a>00285   {
<a name="l00286"></a>00286     <span class="comment">// the rows() call is the value before updating.</span>
<a name="l00287"></a>00287     <span class="comment">// the updateRows() call at the end sets the call to return the</span>
<a name="l00288"></a>00288     <span class="comment">// value from the fits pointer - which is changed by writeFixedArray</span>
<a name="l00289"></a>00289     <span class="comment">// or writeFixedRow.</span>
<a name="l00290"></a>00290 
<a name="l00291"></a>00291     <span class="keyword">const</span> <span class="keywordtype">size_t</span> lastInputRow(indata.size() + firstRow - 1);
<a name="l00292"></a>00292     <span class="keyword">const</span> <span class="keywordtype">size_t</span> newLastRow = std::max(lastInputRow,static_cast&lt;size_t&gt;(<a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>()));
<a name="l00293"></a>00293 
<a name="l00294"></a>00294     <span class="comment">// if the write instruction increases the rows, we need to add</span>
<a name="l00295"></a>00295     <span class="comment">// rows to the data member and preserve its current contents.</span>
<a name="l00296"></a>00296 
<a name="l00297"></a>00297     <span class="comment">// rows() &gt;= origNRows since it is the value for entire table, </span>
<a name="l00298"></a>00298     <span class="comment">// not just this column.</span>
<a name="l00299"></a>00299     <span class="keyword">const</span> <span class="keywordtype">size_t</span> origNRows(m_data.size());
<a name="l00300"></a>00300     <span class="comment">// This will always be an expansion. vector.resize() doesn&apos;t</span>
<a name="l00301"></a>00301     <span class="comment">// invalidate any data on an expansion.</span>
<a name="l00302"></a>00302     <span class="keywordflow">if</span> (newLastRow &gt; origNRows) m_data.resize(newLastRow);
<a name="l00303"></a>00303 
<a name="l00304"></a>00304     <span class="keywordflow">if</span> (<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>())
<a name="l00305"></a>00305     {
<a name="l00306"></a>00306        <span class="comment">// The incoming data will determine each row size, thus</span>
<a name="l00307"></a>00307        <span class="comment">// no need to preserve any existing values in the row.</span>
<a name="l00308"></a>00308        <span class="comment">// Each value will eventually be overwritten.</span>
<a name="l00309"></a>00309        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> iRow = firstRow-1; iRow &lt; lastInputRow; ++iRow)
<a name="l00310"></a>00310        {
<a name="l00311"></a>00311           std::valarray&lt;T&gt;&amp; current = m_data[iRow];
<a name="l00312"></a>00312           <span class="keyword">const</span> <span class="keywordtype">size_t</span> newSize = indata[iRow - (firstRow-1)].size();
<a name="l00313"></a>00313           <span class="keywordflow">if</span> (current.size() != newSize)
<a name="l00314"></a>00314              current.resize(newSize);          
<a name="l00315"></a>00315        }
<a name="l00316"></a>00316     }
<a name="l00317"></a>00317     <span class="keywordflow">else</span>
<a name="l00318"></a>00318     {
<a name="l00319"></a>00319        <span class="comment">// All row sizes in m_data should ALWAYS be either repeat(),</span>
<a name="l00320"></a>00320        <span class="comment">// or 0 if they haven&apos;t been initialized.  This is true regardless</span>
<a name="l00321"></a>00321        <span class="comment">// of the incoming data row size.  </span>
<a name="l00322"></a>00322 
<a name="l00323"></a>00323        <span class="comment">// Perform LAZY initialization of m_data rows.  Only</span>
<a name="l00324"></a>00324        <span class="comment">// expand a row valarray when it is first needed.</span>
<a name="l00325"></a>00325        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> iRow = firstRow-1; iRow &lt; lastInputRow; ++iRow)
<a name="l00326"></a>00326        {
<a name="l00327"></a>00327           <span class="keywordflow">if</span> (m_data[iRow].size() != <a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>())
<a name="l00328"></a>00328              m_data[iRow].resize(<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>());
<a name="l00329"></a>00329        }       
<a name="l00330"></a>00330     }
<a name="l00331"></a>00331   }
<a name="l00332"></a>00332 
<a name="l00333"></a>00333   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00334"></a>00334   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::setDimen ()
<a name="l00335"></a>00335   {
<a name="l00336"></a>00336   <span class="keywordtype">int</span> status(0);
<a name="l00337"></a>00337   FITSUtil:: auto_array_ptr&lt;char&gt; dimValue (<span class="keyword">new</span> <span class="keywordtype">char</span>[FLEN_VALUE]);
<a name="l00338"></a>00338 
<a name="l00339"></a>00339 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00340"></a>00340 <span class="preprocessor"></span>  std::ostrstream key;
<a name="l00341"></a>00341 <span class="preprocessor">#else</span>
<a name="l00342"></a>00342 <span class="preprocessor"></span>  std::ostringstream key;
<a name="l00343"></a>00343 <span class="preprocessor">#endif</span>
<a name="l00344"></a>00344 <span class="preprocessor"></span>  key &lt;&lt; <span class="stringliteral">&quot;TDIM&quot;</span> &lt;&lt; <a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>();
<a name="l00345"></a>00345 
<a name="l00346"></a>00346 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00347"></a>00347 <span class="preprocessor"></span>  fits_read_key_str(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(), key.str(), dimValue.get(),0,&amp;status);
<a name="l00348"></a>00348 <span class="preprocessor">#else</span>
<a name="l00349"></a>00349 <span class="preprocessor"></span>  fits_read_key_str(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),const_cast&lt;char*&gt;(key.str().c_str()),dimValue.get(),0,&amp;status);
<a name="l00350"></a>00350 <span class="preprocessor">#endif</span>
<a name="l00351"></a>00351 <span class="preprocessor"></span>
<a name="l00352"></a>00352   <span class="keywordflow">if</span> (status == 0)
<a name="l00353"></a>00353   {
<a name="l00354"></a>00354         <a class="code" href="classCCfits_1_1Column.html#a8409427a876646e0f1846f55146872bc" title="return TDIMn keyword">dimen</a>(String(dimValue.get()));
<a name="l00355"></a>00355   }
<a name="l00356"></a>00356   }
<a name="l00357"></a>00357 
<a name="l00358"></a>00358   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00359"></a>00359   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::readColumnData (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> last, T* nullValue)
<a name="l00360"></a>00360   {
<a name="l00361"></a>00361   <a class="code" href="classCCfits_1_1Column.html#a2a85f49e6e72ed0b3619df9e586ad159" title="make HDU containing this the current HDU of the fits file.">makeHDUCurrent</a>();
<a name="l00362"></a>00362 
<a name="l00363"></a>00363 
<a name="l00364"></a>00364           <span class="keywordflow">if</span> ( <a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>() &lt; last ) 
<a name="l00365"></a>00365           {
<a name="l00366"></a>00366                 std::cerr &lt;&lt; <span class="stringliteral">&quot;CCfits: More data requested than contained in table. &quot;</span>;
<a name="l00367"></a>00367                 std::cerr &lt;&lt; <span class="stringliteral">&quot;Extracting complete column.\n&quot;</span>;
<a name="l00368"></a>00368                 last = <a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>();
<a name="l00369"></a>00369           }
<a name="l00370"></a>00370 
<a name="l00371"></a>00371           <span class="keywordtype">long</span> nelements = (last - first + 1)*<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>();
<a name="l00372"></a>00372 
<a name="l00373"></a>00373 
<a name="l00374"></a>00374           readColumnData(first,nelements,1,nullValue);   
<a name="l00375"></a>00375           <span class="keywordflow">if</span> (first &lt;= 1 &amp;&amp; last == <a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>()) <a class="code" href="classCCfits_1_1Column.html#a3ab461fa13db155ab8d5fd649cf0e9ba" title="flag set to true if the entire column data has been read from disk">isRead</a>(<span class="keyword">true</span>);
<a name="l00376"></a>00376   }
<a name="l00377"></a>00377 
<a name="l00378"></a>00378   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00379"></a>00379   std::ostream&amp; ColumnVectorData&lt;T&gt;::put (std::ostream&amp; s)<span class="keyword"> const</span>
<a name="l00380"></a>00380 <span class="keyword">  </span>{
<a name="l00381"></a>00381   <span class="comment">// output header information</span>
<a name="l00382"></a>00382     <a class="code" href="classCCfits_1_1Column.html#a636120f892e981e24fc7e29248c66a59" title="internal implementation of &amp;lt;&amp;lt; operator.">Column::put</a>(s);
<a name="l00383"></a>00383     <span class="keywordflow">if</span> ( <a class="code" href="classCCfits_1_1FITS.html#ac897e39e93234792d519913e656be5fc" title="return verbose setting for library">FITS::verboseMode</a>() )
<a name="l00384"></a>00384     {
<a name="l00385"></a>00385           s &lt;&lt; <span class="stringliteral">&quot; Column Legal limits: ( &quot;</span> &lt;&lt; m_minLegalValue &lt;&lt; <span class="stringliteral">&quot;,&quot;</span> &lt;&lt; m_maxLegalValue &lt;&lt; <span class="stringliteral">&quot; )\n&quot;</span> 
<a name="l00386"></a>00386           &lt;&lt; <span class="stringliteral">&quot; Column Data  limits: ( &quot;</span> &lt;&lt; m_minDataValue &lt;&lt; <span class="stringliteral">&quot;,&quot;</span> &lt;&lt; m_maxDataValue &lt;&lt; <span class="stringliteral">&quot; )\n&quot;</span>;
<a name="l00387"></a>00387     }
<a name="l00388"></a>00388     <span class="keywordflow">if</span> (!m_data.empty())
<a name="l00389"></a>00389     {
<a name="l00390"></a>00390           <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j &lt; m_data.size(); j++)
<a name="l00391"></a>00391           {
<a name="l00392"></a>00392                   <span class="keywordtype">size_t</span> n = m_data[j].size();
<a name="l00393"></a>00393                   <span class="keywordflow">if</span> ( n )
<a name="l00394"></a>00394                   {
<a name="l00395"></a>00395                           s &lt;&lt; <span class="stringliteral">&quot;Row &quot;</span> &lt;&lt; j + 1 &lt;&lt; <span class="stringliteral">&quot; Vector Size &quot;</span> &lt;&lt; n &lt;&lt; <span class="charliteral">&apos;\n&apos;</span>;
<a name="l00396"></a>00396                           <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> k = 0; k &lt; n - 1; k++)
<a name="l00397"></a>00397                           {
<a name="l00398"></a>00398                                   s &lt;&lt; m_data[j][k] &lt;&lt; <span class="charliteral">&apos;\t&apos;</span>;
<a name="l00399"></a>00399                           }
<a name="l00400"></a>00400                           s &lt;&lt; m_data[j][n - 1] &lt;&lt; <span class="charliteral">&apos;\n&apos;</span>;
<a name="l00401"></a>00401                   }
<a name="l00402"></a>00402           }
<a name="l00403"></a>00403     }
<a name="l00404"></a>00404 
<a name="l00405"></a>00405     <span class="keywordflow">return</span> s;
<a name="l00406"></a>00406   }
<a name="l00407"></a>00407 
<a name="l00408"></a>00408   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00409"></a>00409   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::writeData (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; indata, <span class="keywordtype">long</span> numRows, <span class="keywordtype">long</span> firstRow, T* nullValue)
<a name="l00410"></a>00410   {
<a name="l00411"></a>00411      <span class="comment">// This version of writeData is called by Column write functions which </span>
<a name="l00412"></a>00412      <span class="comment">// can only write the same number of elements to each row.  </span>
<a name="l00413"></a>00413      <span class="comment">// For fixed width columns, this must be equal to the repeat value</span>
<a name="l00414"></a>00414      <span class="comment">// or an exception is thrown.  For variable width, it only requires</span>
<a name="l00415"></a>00415      <span class="comment">// that indata.size()/numRows is an int.</span>
<a name="l00416"></a>00416 
<a name="l00417"></a>00417      <span class="comment">// won&apos;t do anything if &lt; 0, and will give divide check if == 0.</span>
<a name="l00418"></a>00418      <span class="keywordflow">if</span> (numRows &lt;= 0) <span class="keywordflow">throw</span> InvalidNumberOfRows(numRows);
<a name="l00419"></a>00419 
<a name="l00420"></a>00420 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00421"></a>00421 <span class="preprocessor"></span>     std::ostrstream msgStr;
<a name="l00422"></a>00422 <span class="preprocessor">#else</span>
<a name="l00423"></a>00423 <span class="preprocessor"></span>     std::ostringstream msgStr;
<a name="l00424"></a>00424 <span class="preprocessor">#endif            </span>
<a name="l00425"></a>00425 <span class="preprocessor"></span>     <span class="keywordflow">if</span> (indata.size() % <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(numRows))
<a name="l00426"></a>00426      {
<a name="l00427"></a>00427         msgStr &lt;&lt; <span class="stringliteral">&quot;To use this write function, input array size&quot;</span>
<a name="l00428"></a>00428            &lt;&lt;<span class="stringliteral">&quot;\n must be exactly divisible by requested num rows: &quot;</span>
<a name="l00429"></a>00429            &lt;&lt; numRows;
<a name="l00430"></a>00430         <span class="keywordflow">throw</span> InsufficientElements(msgStr.str());
<a name="l00431"></a>00431      }
<a name="l00432"></a>00432      <span class="keyword">const</span> <span class="keywordtype">size_t</span> cellsize = indata.size()/<span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(numRows);
<a name="l00433"></a>00433 
<a name="l00434"></a>00434      <span class="keywordflow">if</span> (!<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>() &amp;&amp; cellsize != <a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>() )
<a name="l00435"></a>00435      {      
<a name="l00436"></a>00436         msgStr &lt;&lt; <span class="stringliteral">&quot;column: &quot;</span> &lt;&lt; <a class="code" href="classCCfits_1_1Column.html#a09634d63a37f46d871ddee6ffa456fe7" title="return name of Column (TTYPEn keyword)">name</a>() 
<a name="l00437"></a>00437                &lt;&lt;  <span class="stringliteral">&quot;\n input data size: &quot;</span> &lt;&lt; indata.size() 
<a name="l00438"></a>00438                &lt;&lt; <span class="stringliteral">&quot; required: &quot;</span> &lt;&lt; numRows*<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>();
<a name="l00439"></a>00439         String msg(msgStr.str());
<a name="l00440"></a>00440         <span class="keywordflow">throw</span> InsufficientElements(msg);     
<a name="l00441"></a>00441      }
<a name="l00442"></a>00442 
<a name="l00443"></a>00443      std::vector&lt;std::valarray&lt;T&gt; &gt; internalFormat(numRows);
<a name="l00444"></a>00444 
<a name="l00445"></a>00445      <span class="comment">// support writing equal row lengths to variable columns.</span>
<a name="l00446"></a>00446 
<a name="l00447"></a>00447      <span class="keywordflow">for</span> (<span class="keywordtype">long</span> j = 0; j &lt; numRows; ++j)
<a name="l00448"></a>00448      {
<a name="l00449"></a>00449         internalFormat[j].resize(cellsize);
<a name="l00450"></a>00450         internalFormat[j] = indata[std::slice(cellsize*j,cellsize,1)];
<a name="l00451"></a>00451      }
<a name="l00452"></a>00452 
<a name="l00453"></a>00453      <span class="comment">// change the size of m_data based on the first row to be written</span>
<a name="l00454"></a>00454      <span class="comment">// and on the input data vector sizes.</span>
<a name="l00455"></a>00455 
<a name="l00456"></a>00456      writeData(internalFormat,firstRow,nullValue);    
<a name="l00457"></a>00457   }
<a name="l00458"></a>00458 
<a name="l00459"></a>00459   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00460"></a>00460   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::writeData (<span class="keyword">const</span> std::vector&lt;std::valarray&lt;T&gt; &gt;&amp; indata, <span class="keywordtype">long</span> firstRow, T* nullValue)
<a name="l00461"></a>00461   {
<a name="l00462"></a>00462      <span class="comment">// This is called directly by Column&apos;s writeArrays functions, and indirectly</span>
<a name="l00463"></a>00463      <span class="comment">// by both categories of write functions, ie. those which allow differing</span>
<a name="l00464"></a>00464      <span class="comment">// lengths per row and those that don&apos;t.</span>
<a name="l00465"></a>00465     <span class="keyword">const</span> <span class="keywordtype">size_t</span> nInputRows(indata.size());   
<a name="l00466"></a>00466     <span class="keyword">using</span>  std::valarray;
<a name="l00467"></a>00467 
<a name="l00468"></a>00468     resizeDataObject(indata,firstRow); 
<a name="l00469"></a>00469     <span class="comment">// After the above call, can assume all m_data arrays to be written to </span>
<a name="l00470"></a>00470     <span class="comment">// have been properly resized whether we&apos;re dealing with fixed or</span>
<a name="l00471"></a>00471     <span class="comment">// variable length.       </span>
<a name="l00472"></a>00472 
<a name="l00473"></a>00473     <span class="keywordflow">if</span> (<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>())
<a name="l00474"></a>00474     {
<a name="l00475"></a>00475        <span class="comment">// firstRow is 1-based, but all these internal row variables </span>
<a name="l00476"></a>00476        <span class="comment">// will be 0-based.  </span>
<a name="l00477"></a>00477        <span class="keyword">const</span> <span class="keywordtype">size_t</span> endRow = nInputRows + firstRow-1;
<a name="l00478"></a>00478        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> iRow = firstRow-1; iRow &lt; endRow; ++iRow)
<a name="l00479"></a>00479        {
<a name="l00480"></a>00480           m_data[iRow] = indata[iRow - (firstRow-1)];
<a name="l00481"></a>00481           <span class="comment">// doWrite wants 1-based rows.</span>
<a name="l00482"></a>00482           doWrite(&amp;m_data[iRow][0], iRow+1, m_data[iRow].size(), 1, nullValue);
<a name="l00483"></a>00483        }
<a name="l00484"></a>00484        <a class="code" href="classCCfits_1_1Column.html#a53c239a7eda28388ac278de7f5b6f59f" title="return a pointer to the Table which owns this Column">parent</a>()-&gt;updateRows();
<a name="l00485"></a>00485     }
<a name="l00486"></a>00486     <span class="keywordflow">else</span>
<a name="l00487"></a>00487     {
<a name="l00488"></a>00488        <span class="comment">// Check for simplest case of all valarrays of size repeat().</span>
<a name="l00489"></a>00489        <span class="comment">// If any are greater, throw an error.</span>
<a name="l00490"></a>00490        <span class="keyword">const</span> <span class="keywordtype">size_t</span> colRepeat = <a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>();
<a name="l00491"></a>00491        <span class="keywordtype">bool</span> allEqualRepeat = <span class="keyword">true</span>;
<a name="l00492"></a>00492        <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> i=0; i&lt;nInputRows; ++i)
<a name="l00493"></a>00493        {
<a name="l00494"></a>00494           <span class="keyword">const</span> <span class="keywordtype">size_t</span> sz = indata[i].size();
<a name="l00495"></a>00495           <span class="keywordflow">if</span> (sz &gt; colRepeat)
<a name="l00496"></a>00496           {
<a name="l00497"></a>00497 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00498"></a>00498 <span class="preprocessor"></span>             std::ostrstream oss;
<a name="l00499"></a>00499 <span class="preprocessor">#else</span>
<a name="l00500"></a>00500 <span class="preprocessor"></span>             std::ostringstream oss;
<a name="l00501"></a>00501 <span class="preprocessor">#endif </span>
<a name="l00502"></a>00502 <span class="preprocessor"></span>             oss &lt;&lt; <span class="stringliteral">&quot; vector column length &quot;</span> &lt;&lt; colRepeat 
<a name="l00503"></a>00503                 &lt;&lt;<span class="stringliteral">&quot;, input valarray length &quot;</span> &lt;&lt; sz;
<a name="l00504"></a>00504              <span class="keywordflow">throw</span> InvalidRowParameter(oss.str());               
<a name="l00505"></a>00505           }
<a name="l00506"></a>00506           <span class="keywordflow">if</span> (sz &lt; colRepeat)
<a name="l00507"></a>00507              allEqualRepeat = <span class="keyword">false</span>;
<a name="l00508"></a>00508        }
<a name="l00509"></a>00509 
<a name="l00510"></a>00510        <span class="keywordflow">if</span> (allEqualRepeat)
<a name="l00511"></a>00511        {
<a name="l00512"></a>00512           <span class="comment">// concatenate the valarrays and write.</span>
<a name="l00513"></a>00513           <span class="keyword">const</span> <span class="keywordtype">size_t</span> nElements (colRepeat*nInputRows);
<a name="l00514"></a>00514           FITSUtil::CVAarray&lt;T&gt; convert;
<a name="l00515"></a>00515           FITSUtil::auto_array_ptr&lt;T&gt; pArray(convert(indata));
<a name="l00516"></a>00516           T* array = pArray.get();
<a name="l00517"></a>00517 
<a name="l00518"></a>00518           <span class="comment">// if T is complex, then CVAarray returns a </span>
<a name="l00519"></a>00519           <span class="comment">// C-array of complex objects. But FITS requires an array of complex&apos;s</span>
<a name="l00520"></a>00520           <span class="comment">// value_type.</span>
<a name="l00521"></a>00521 
<a name="l00522"></a>00522           <span class="comment">// This writes to the file and also calls updateRows.</span>
<a name="l00523"></a>00523           writeFixedArray(array,nElements,nInputRows,firstRow,nullValue);            
<a name="l00524"></a>00524 
<a name="l00525"></a>00525           <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 0; j &lt; nInputRows ; ++j)
<a name="l00526"></a>00526           {
<a name="l00527"></a>00527               <span class="keyword">const</span> valarray&lt;T&gt;&amp; input   = indata[j];
<a name="l00528"></a>00528               valarray&lt;T&gt;&amp; current = m_data[j + firstRow - 1];
<a name="l00529"></a>00529               <span class="comment">// current should be resized by resizeDataObject.</span>
<a name="l00530"></a>00530               current = input;
<a name="l00531"></a>00531           }
<a name="l00532"></a>00532        }
<a name="l00533"></a>00533        <span class="keywordflow">else</span>
<a name="l00534"></a>00534        {
<a name="l00535"></a>00535           <span class="comment">// Some input arrays have fewer than colRepeat elements. </span>
<a name="l00536"></a>00536           <span class="keyword">const</span> <span class="keywordtype">size_t</span> endRow = nInputRows + firstRow-1;
<a name="l00537"></a>00537           <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> iRow = firstRow-1; iRow&lt;endRow; ++iRow)
<a name="l00538"></a>00538           {
<a name="l00539"></a>00539              <span class="comment">// resizeDataObject should already have resized all</span>
<a name="l00540"></a>00540              <span class="comment">// corresponding m_data rows to repeat().</span>
<a name="l00541"></a>00541              <span class="keyword">const</span> valarray&lt;T&gt;&amp; input = indata[iRow-(firstRow-1)];
<a name="l00542"></a>00542              writeFixedRow(input, iRow, 1, nullValue);
<a name="l00543"></a>00543           }
<a name="l00544"></a>00544           <a class="code" href="classCCfits_1_1Column.html#a53c239a7eda28388ac278de7f5b6f59f" title="return a pointer to the Table which owns this Column">parent</a>()-&gt;updateRows();          
<a name="l00545"></a>00545        }  
<a name="l00546"></a>00546 
<a name="l00547"></a>00547     } <span class="comment">// end if !varLength</span>
<a name="l00548"></a>00548   }
<a name="l00549"></a>00549 
<a name="l00550"></a>00550   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00551"></a>00551   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::readRow (<span class="keywordtype">size_t</span> row, T* nullValue)
<a name="l00552"></a>00552   {
<a name="l00553"></a>00553           <a class="code" href="classCCfits_1_1Column.html#a2a85f49e6e72ed0b3619df9e586ad159" title="make HDU containing this the current HDU of the fits file.">makeHDUCurrent</a>();
<a name="l00554"></a>00554 
<a name="l00555"></a>00555 
<a name="l00556"></a>00556 
<a name="l00557"></a>00557           <span class="keywordflow">if</span> ( row &gt; static_cast&lt;size_t&gt;(<a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>()) ) 
<a name="l00558"></a>00558           {
<a name="l00559"></a>00559 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00560"></a>00560 <span class="preprocessor"></span>                  std::ostrstream msg;
<a name="l00561"></a>00561 <span class="preprocessor">#else</span>
<a name="l00562"></a>00562 <span class="preprocessor"></span>                  std::ostringstream msg;
<a name="l00563"></a>00563 <span class="preprocessor">#endif</span>
<a name="l00564"></a>00564 <span class="preprocessor"></span>                msg &lt;&lt; <span class="stringliteral">&quot; row requested: &quot;</span> &lt;&lt; row &lt;&lt; <span class="stringliteral">&quot; row range: 1 - &quot;</span> &lt;&lt; <a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>();                
<a name="l00565"></a>00565 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00566"></a>00566 <span class="preprocessor"></span>                msg &lt;&lt; std::ends;
<a name="l00567"></a>00567 <span class="preprocessor">#endif</span>
<a name="l00568"></a>00568 <span class="preprocessor"></span>
<a name="l00569"></a>00569                 <span class="keywordflow">throw</span> Column::InvalidRowNumber(msg.str()); 
<a name="l00570"></a>00570           }
<a name="l00571"></a>00571 
<a name="l00572"></a>00572           <span class="comment">// this is really for documentation purposes. I expect the optimizer will</span>
<a name="l00573"></a>00573           <span class="comment">// remove this redundant definition .</span>
<a name="l00574"></a>00574           <span class="keywordtype">bool</span> variable(<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>() &lt; 0); 
<a name="l00575"></a>00575 
<a name="l00576"></a>00576 
<a name="l00577"></a>00577           <span class="keywordtype">long</span> nelements(<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>());
<a name="l00578"></a>00578 
<a name="l00579"></a>00579           <span class="keywordflow">if</span> (variable)
<a name="l00580"></a>00580           {
<a name="l00581"></a>00581               readVariableRow(row,nullValue);
<a name="l00582"></a>00582           }
<a name="l00583"></a>00583           <span class="keywordflow">else</span>
<a name="l00584"></a>00584           {      
<a name="l00585"></a>00585               readColumnData(row,nelements,1,nullValue);      
<a name="l00586"></a>00586           }
<a name="l00587"></a>00587   }
<a name="l00588"></a>00588 
<a name="l00589"></a>00589   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00590"></a>00590   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::readVariableRow (<span class="keywordtype">size_t</span> row, T* nullValue)
<a name="l00591"></a>00591   {
<a name="l00592"></a>00592       <span class="keywordtype">int</span> status(0);
<a name="l00593"></a>00593       <span class="keywordtype">long</span> offset(0);
<a name="l00594"></a>00594       <span class="keywordtype">long</span> <a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>(0);
<a name="l00595"></a>00595       <span class="keywordflow">if</span> (fits_read_descript(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(),static_cast&lt;long&gt;(row),
<a name="l00596"></a>00596                       &amp;<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>,&amp;offset,&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00597"></a>00597       readColumnData(row,<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>,1,nullValue);   
<a name="l00598"></a>00598   }
<a name="l00599"></a>00599 
<a name="l00600"></a>00600   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00601"></a>00601   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::readColumnData (<span class="keywordtype">long</span> firstrow, <span class="keywordtype">long</span> nelements, <span class="keywordtype">long</span> firstelem, T* nullValue)
<a name="l00602"></a>00602   {
<a name="l00603"></a>00603    <span class="keywordtype">int</span>   status=0;
<a name="l00604"></a>00604 
<a name="l00605"></a>00605    FITSUtil::auto_array_ptr&lt;T&gt; pArray(<span class="keyword">new</span> T[nelements]); 
<a name="l00606"></a>00606    T*     array = pArray.get();
<a name="l00607"></a>00607    <span class="keywordtype">int</span>    anynul(0);
<a name="l00608"></a>00608 
<a name="l00609"></a>00609 
<a name="l00610"></a>00610 
<a name="l00611"></a>00611    <span class="keywordflow">if</span> (fits_read_col(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(), abs(<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>()),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(), firstrow, firstelem,
<a name="l00612"></a>00612                           nelements, nullValue, array, &amp;anynul, &amp;status) != 0)  
<a name="l00613"></a>00613        <span class="keywordflow">throw</span> FitsError(status);
<a name="l00614"></a>00614 
<a name="l00615"></a>00615    <span class="keywordtype">size_t</span> countRead = 0;
<a name="l00616"></a>00616    <span class="keyword">const</span> <span class="keywordtype">size_t</span> ONE = 1;
<a name="l00617"></a>00617 
<a name="l00618"></a>00618    <span class="keywordflow">if</span> (m_data.size() != <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(<a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>())) m_data.resize(<a class="code" href="classCCfits_1_1Column.html#ad11ca53a9ed8c8d60e12aff99cc757af" title="return the number of rows in the table.">rows</a>());
<a name="l00619"></a>00619    <span class="keywordtype">size_t</span> vectorSize(0);
<a name="l00620"></a>00620    <span class="keywordflow">if</span> (!<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>())
<a name="l00621"></a>00621    {
<a name="l00622"></a>00622 
<a name="l00623"></a>00623         vectorSize = std::max(<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>(),ONE); <span class="comment">// safety check.</span>
<a name="l00624"></a>00624 
<a name="l00625"></a>00625    }
<a name="l00626"></a>00626    <span class="keywordflow">else</span>
<a name="l00627"></a>00627    {
<a name="l00628"></a>00628         <span class="comment">// assume that the user specified the correct length for </span>
<a name="l00629"></a>00629         <span class="comment">// variable columns. This should be ok since readVariableColumns</span>
<a name="l00630"></a>00630         <span class="comment">// uses fits_read_descripts to return this information from the</span>
<a name="l00631"></a>00631         <span class="comment">// fits pointer, and this is passed as nelements here.</span>
<a name="l00632"></a>00632         vectorSize = nelements;       
<a name="l00633"></a>00633    }
<a name="l00634"></a>00634    <span class="keywordtype">size_t</span> n = nelements; 
<a name="l00635"></a>00635 
<a name="l00636"></a>00636    <span class="keywordtype">int</span> i = firstrow;
<a name="l00637"></a>00637    <span class="keywordtype">int</span> ii = i - 1;
<a name="l00638"></a>00638    <span class="keywordflow">while</span> ( countRead &lt; n)
<a name="l00639"></a>00639    {
<a name="l00640"></a>00640          std::valarray&lt;T&gt;&amp; current = m_data[ii];
<a name="l00641"></a>00641          <span class="keywordflow">if</span> (current.size() != vectorSize) current.resize(vectorSize);
<a name="l00642"></a>00642          <span class="keywordtype">int</span> elementsInFirstRow = vectorSize-firstelem + 1;
<a name="l00643"></a>00643          <span class="keywordtype">bool</span> lastRow = ( (nelements - countRead) &lt; vectorSize);
<a name="l00644"></a>00644          <span class="keywordflow">if</span> (lastRow)
<a name="l00645"></a>00645          {
<a name="l00646"></a>00646                <span class="keywordtype">int</span> elementsInLastRow = nelements - countRead;
<a name="l00647"></a>00647                std::valarray&lt;T&gt; ttmp(array + vectorSize*(ii-firstrow) + elementsInFirstRow,
<a name="l00648"></a>00648                                                      elementsInLastRow);
<a name="l00649"></a>00649                <span class="keywordflow">for</span> (<span class="keywordtype">int</span> kk = 0; kk &lt; elementsInLastRow; kk++) current[kk] = ttmp[kk];
<a name="l00650"></a>00650                countRead += elementsInLastRow;
<a name="l00651"></a>00651 
<a name="l00652"></a>00652          }
<a name="l00653"></a>00653          <span class="comment">// what to do with complete rows</span>
<a name="l00654"></a>00654          <span class="keywordflow">else</span> 
<a name="l00655"></a>00655          {
<a name="l00656"></a>00656                 <span class="keywordflow">if</span> (firstelem == 1 || (firstelem &gt; 1 &amp;&amp; i &gt; firstrow) )
<a name="l00657"></a>00657                 {
<a name="l00658"></a>00658                         std::valarray&lt;T&gt; ttmp(array + vectorSize*(ii - firstrow) + 
<a name="l00659"></a>00659                                         elementsInFirstRow,vectorSize);
<a name="l00660"></a>00660                         current = ttmp;
<a name="l00661"></a>00661                         ii++;
<a name="l00662"></a>00662                         i++;
<a name="l00663"></a>00663                         countRead += vectorSize;   
<a name="l00664"></a>00664                 }   
<a name="l00665"></a>00665                 <span class="keywordflow">else</span>
<a name="l00666"></a>00666                 { 
<a name="l00667"></a>00667                         <span class="keywordflow">if</span> (i == firstrow)
<a name="l00668"></a>00668                         {
<a name="l00669"></a>00669                                 std::valarray&lt;T&gt; ttmp(array,elementsInFirstRow);
<a name="l00670"></a>00670                                 <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> kk = firstelem ; kk &lt; vectorSize ; kk++)
<a name="l00671"></a>00671                                       current[kk] = ttmp[kk-firstelem];   
<a name="l00672"></a>00672                                 countRead += elementsInFirstRow;
<a name="l00673"></a>00673                                 i++;
<a name="l00674"></a>00674                                 ii++;
<a name="l00675"></a>00675                         }
<a name="l00676"></a>00676                 }
<a name="l00677"></a>00677          }
<a name="l00678"></a>00678     }
<a name="l00679"></a>00679   }
<a name="l00680"></a>00680 
<a name="l00681"></a>00681   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00682"></a>00682   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::writeData (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; indata, <span class="keyword">const</span> std::vector&lt;long&gt;&amp; vectorLengths, <span class="keywordtype">long</span> firstRow, T* nullValue)
<a name="l00683"></a>00683   {
<a name="l00684"></a>00684      <span class="comment">// Called from Column write functions which allow differing lengths</span>
<a name="l00685"></a>00685      <span class="comment">// for each row.</span>
<a name="l00686"></a>00686     <span class="keyword">using namespace </span>std;
<a name="l00687"></a>00687     <span class="keyword">const</span> <span class="keywordtype">size_t</span> N(vectorLengths.size());
<a name="l00688"></a>00688     vector&lt;long&gt; sums(N);
<a name="l00689"></a>00689     <span class="comment">// pre-calculate partial sums of vector lengths for use as array offsets.</span>
<a name="l00690"></a>00690     partial_sum(vectorLengths.begin(),vectorLengths.end(),sums.begin());
<a name="l00691"></a>00691     <span class="comment">// check that sufficient data have been supplied to carry out the entire operation.</span>
<a name="l00692"></a>00692     <span class="keywordflow">if</span> (indata.size() &lt; <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(sums[N-1]) )
<a name="l00693"></a>00693     {
<a name="l00694"></a>00694 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00695"></a>00695 <span class="preprocessor"></span>        ostrstream msgStr;
<a name="l00696"></a>00696 <span class="preprocessor">#else</span>
<a name="l00697"></a>00697 <span class="preprocessor"></span>        ostringstream msgStr;
<a name="l00698"></a>00698 <span class="preprocessor">#endif            </span>
<a name="l00699"></a>00699 <span class="preprocessor"></span>        msgStr &lt;&lt; <span class="stringliteral">&quot; input data size: &quot;</span> &lt;&lt; indata.size() &lt;&lt; <span class="stringliteral">&quot; vector length sum: &quot;</span> &lt;&lt; sums[N-1];
<a name="l00700"></a>00700 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00701"></a>00701 <span class="preprocessor"></span>        msgStr &lt;&lt; std::ends;
<a name="l00702"></a>00702 <span class="preprocessor">#endif            </span>
<a name="l00703"></a>00703 <span class="preprocessor"></span>
<a name="l00704"></a>00704         String msg(msgStr.str());
<a name="l00705"></a>00705         <span class="keywordflow">throw</span> InsufficientElements(msg);     
<a name="l00706"></a>00706     }
<a name="l00707"></a>00707 
<a name="l00708"></a>00708     vector&lt;valarray&lt;T&gt; &gt; vvArray(N);
<a name="l00709"></a>00709     <span class="keywordtype">long</span>&amp; last = sums[0];
<a name="l00710"></a>00710     vvArray[0].resize(last);
<a name="l00711"></a>00711     <span class="keywordflow">for</span> (<span class="keywordtype">long</span> jj = 0; jj &lt; last; ++jj) vvArray[0][jj] = indata[jj];
<a name="l00712"></a>00712 
<a name="l00713"></a>00713     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> j = 1; j &lt; N; ++j)
<a name="l00714"></a>00714     {
<a name="l00715"></a>00715                valarray&lt;T&gt;&amp; __tmp = vvArray[j];
<a name="l00716"></a>00716                <span class="comment">// these  make the code much more readable</span>
<a name="l00717"></a>00717                <span class="keywordtype">long</span>&amp; first = sums[j-1];
<a name="l00718"></a>00718                <span class="keywordtype">long</span>&amp; jlast = sums[j];
<a name="l00719"></a>00719                __tmp.resize(jlast - first);
<a name="l00720"></a>00720                <span class="keywordflow">for</span> (<span class="keywordtype">long</span> k = first; k &lt; jlast; ++k)
<a name="l00721"></a>00721                { 
<a name="l00722"></a>00722                         __tmp[k - first] = indata[k];
<a name="l00723"></a>00723                }
<a name="l00724"></a>00724     }       
<a name="l00725"></a>00725 
<a name="l00726"></a>00726     writeData(vvArray,firstRow,nullValue);
<a name="l00727"></a>00727   }
<a name="l00728"></a>00728 
<a name="l00729"></a>00729   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00730"></a>00730   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::writeFixedRow (<span class="keyword">const</span> std::valarray&lt;T&gt;&amp; data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> firstElem, T* nullValue)
<a name="l00731"></a>00731   {
<a name="l00732"></a>00732 
<a name="l00733"></a>00733     <span class="comment">// This is to be called only for FIXED length vector columns.  It will </span>
<a name="l00734"></a>00734     <span class="comment">// throw if data.size()+firstElem goes beyond the repeat value.</span>
<a name="l00735"></a>00735     <span class="comment">// If data.size() is less than repeat, it leaves the remaining values</span>
<a name="l00736"></a>00736     <span class="comment">// undisturbed both in the file and in m_data storage.</span>
<a name="l00737"></a>00737 
<a name="l00738"></a>00738 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00739"></a>00739 <span class="preprocessor"></span>    std::ostrstream msgStr;
<a name="l00740"></a>00740 <span class="preprocessor">#else</span>
<a name="l00741"></a>00741 <span class="preprocessor"></span>    std::ostringstream msgStr;
<a name="l00742"></a>00742 <span class="preprocessor">#endif            </span>
<a name="l00743"></a>00743 <span class="preprocessor"></span>    <span class="keywordflow">if</span> (<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>())
<a name="l00744"></a>00744     {
<a name="l00745"></a>00745        msgStr &lt;&lt;<span class="stringliteral">&quot;Calling ColumnVectorData::writeFixedRow for a variable length column.\n&quot;</span>;
<a name="l00746"></a>00746        <span class="keywordflow">throw</span> FitsFatal(msgStr.str()); 
<a name="l00747"></a>00747     }
<a name="l00748"></a>00748 
<a name="l00749"></a>00749     std::valarray&lt;T&gt;&amp; storedRow = m_data[row];    
<a name="l00750"></a>00750     <span class="keywordtype">long</span> inputSize = <span class="keyword">static_cast&lt;</span><span class="keywordtype">long</span><span class="keyword">&gt;</span>(data.size());
<a name="l00751"></a>00751     <span class="keywordtype">long</span> storedSize(storedRow.size());
<a name="l00752"></a>00752     <span class="keywordflow">if</span> (storedSize != static_cast&lt;long&gt;(<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>()))
<a name="l00753"></a>00753     {
<a name="l00754"></a>00754        msgStr&lt;&lt;<span class="stringliteral">&quot;stored array size vs. column width mismatch in ColumnVectorData::writeFixedRow.\n&quot;</span>;
<a name="l00755"></a>00755        <span class="keywordflow">throw</span> FitsFatal(msgStr.str());
<a name="l00756"></a>00756     }
<a name="l00757"></a>00757 
<a name="l00758"></a>00758     <span class="keywordflow">if</span> (inputSize + firstElem - 1 &gt; storedSize)
<a name="l00759"></a>00759     { 
<a name="l00760"></a>00760           msgStr &lt;&lt; <span class="stringliteral">&quot; requested write &quot;</span> &lt;&lt; firstElem &lt;&lt; <span class="stringliteral">&quot; to &quot;</span> 
<a name="l00761"></a>00761                  &lt;&lt; firstElem  + inputSize - 1 &lt;&lt; <span class="stringliteral">&quot; exceeds vector length &quot;</span> &lt;&lt; <a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>();
<a name="l00762"></a>00762        <span class="keywordflow">throw</span> InvalidRowParameter(msgStr.str());        
<a name="l00763"></a>00763     }
<a name="l00764"></a>00764 
<a name="l00765"></a>00765     <span class="comment">// CANNOT give a strong exception safety guarantee because writing</span>
<a name="l00766"></a>00766     <span class="comment">// data changes the file. Any corrective action that could be taken</span>
<a name="l00767"></a>00767     <span class="comment">// [e.g. holding initial contents of the row and writing it back after</span>
<a name="l00768"></a>00768     <span class="comment">// an exception is thrown] could in principle throw the same exception</span>
<a name="l00769"></a>00769     <span class="comment">// we are trying to protect from.</span>
<a name="l00770"></a>00770 
<a name="l00771"></a>00771     <span class="comment">// routine does however give the weak guarantee (no resource leaks).    </span>
<a name="l00772"></a>00772 
<a name="l00773"></a>00773     <span class="comment">// It&apos;s never a good thing to cast away a const, but doWrite calls the </span>
<a name="l00774"></a>00774     <span class="comment">// CFITSIO write functions which take a non-const pointer (though</span>
<a name="l00775"></a>00775     <span class="comment">// it shouldn&apos;t actually modify the array), and I&apos;d rather not </span>
<a name="l00776"></a>00776     <span class="comment">// copy the entire valarray just to avoid this problem.</span>
<a name="l00777"></a>00777     std::valarray&lt;T&gt;&amp; lvData = <span class="keyword">const_cast&lt;</span>std::valarray&lt;T&gt;&amp;<span class="keyword">&gt;</span>(data);
<a name="l00778"></a>00778     T* inPointer = &amp;lvData[0];
<a name="l00779"></a>00779     doWrite(inPointer, row+1, inputSize, firstElem, nullValue); 
<a name="l00780"></a>00780 
<a name="l00781"></a>00781     <span class="comment">// Writing to disk was successful, now update FITS object and return.</span>
<a name="l00782"></a>00782     <span class="keyword">const</span> <span class="keywordtype">size_t</span> offset = <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(firstElem) - 1;
<a name="l00783"></a>00783     <span class="keywordflow">for</span> (<span class="keywordtype">size_t</span> iElem=0; iElem &lt; static_cast&lt;size_t&gt;(inputSize); ++iElem)
<a name="l00784"></a>00784     {
<a name="l00785"></a>00785        <span class="comment">// This doesn&apos;t require inPointer&apos;s non-constness.  It&apos;s just</span>
<a name="l00786"></a>00786        <span class="comment">// used here to speed things up a bit.</span>
<a name="l00787"></a>00787        storedRow[iElem + offset] = inPointer[iElem];
<a name="l00788"></a>00788     }
<a name="l00789"></a>00789   }
<a name="l00790"></a>00790 
<a name="l00791"></a>00791   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00792"></a>00792   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::writeFixedArray (T* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, T* nullValue)
<a name="l00793"></a>00793   {
<a name="l00794"></a>00794     <span class="keywordtype">int</span> status(0);
<a name="l00795"></a>00795 
<a name="l00796"></a>00796     <span class="comment">// check for sanity of inputs, then write to file.</span>
<a name="l00797"></a>00797     <span class="comment">// this function writes only complete rows to a table with</span>
<a name="l00798"></a>00798     <span class="comment">// fixed width rows.</span>
<a name="l00799"></a>00799 
<a name="l00800"></a>00800 
<a name="l00801"></a>00801     <span class="keywordflow">if</span> ( nElements &lt; nRows*static_cast&lt;long&gt;(<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>()) )
<a name="l00802"></a>00802     {
<a name="l00803"></a>00803 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l00804"></a>00804 <span class="preprocessor"></span>        std::ostrstream msgStr;
<a name="l00805"></a>00805 <span class="preprocessor">#else</span>
<a name="l00806"></a>00806 <span class="preprocessor"></span>        std::ostringstream msgStr;
<a name="l00807"></a>00807 <span class="preprocessor">#endif</span>
<a name="l00808"></a>00808 <span class="preprocessor"></span>        msgStr &lt;&lt; <span class="stringliteral">&quot; input array size: &quot;</span> &lt;&lt; nElements &lt;&lt; <span class="stringliteral">&quot; required &quot;</span> &lt;&lt; nRows*<a class="code" href="classCCfits_1_1Column.html#a922e6694d82092fc487c406b74287ea0" title="get the repeat count for the rows">repeat</a>();
<a name="l00809"></a>00809         String msg(msgStr.str());
<a name="l00810"></a>00810 
<a name="l00811"></a>00811             <span class="keywordflow">throw</span> Column::InsufficientElements(msg);
<a name="l00812"></a>00812     } 
<a name="l00813"></a>00813 
<a name="l00814"></a>00814     <span class="keywordflow">if</span> (nullValue) 
<a name="l00815"></a>00815     {
<a name="l00816"></a>00816        <span class="keywordflow">if</span> (fits_write_colnull(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),abs(<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>()),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(),firstRow,
<a name="l00817"></a>00817                            1,nElements,data,nullValue,&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00818"></a>00818     }
<a name="l00819"></a>00819     <span class="keywordflow">else</span>
<a name="l00820"></a>00820     {
<a name="l00821"></a>00821        <span class="keywordflow">if</span> (fits_write_col(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),abs(<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>()),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(),firstRow,
<a name="l00822"></a>00822                            1,nElements,data,&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00823"></a>00823     }
<a name="l00824"></a>00824 
<a name="l00825"></a>00825     <a class="code" href="classCCfits_1_1Column.html#a53c239a7eda28388ac278de7f5b6f59f" title="return a pointer to the Table which owns this Column">parent</a>()-&gt;updateRows();
<a name="l00826"></a>00826   }
<a name="l00827"></a>00827 
<a name="l00828"></a>00828   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00829"></a>00829   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::insertRows (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> number)
<a name="l00830"></a>00830   {
<a name="l00831"></a>00831     <span class="keyword">typename</span> std::vector&lt;std::valarray&lt;T&gt; &gt;::iterator in;
<a name="l00832"></a>00832     <span class="keywordflow">if</span> (first !=0) 
<a name="l00833"></a>00833     {
<a name="l00834"></a>00834             in = m_data.begin()+first;
<a name="l00835"></a>00835     }
<a name="l00836"></a>00836     <span class="keywordflow">else</span>
<a name="l00837"></a>00837     {
<a name="l00838"></a>00838             in = m_data.begin();
<a name="l00839"></a>00839     }           
<a name="l00840"></a>00840 
<a name="l00841"></a>00841     <span class="comment">// non-throwing operations.</span>
<a name="l00842"></a>00842     m_data.insert(in,number,std::valarray&lt;T&gt;(T(),0));
<a name="l00843"></a>00843   }
<a name="l00844"></a>00844 
<a name="l00845"></a>00845   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00846"></a>00846   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::deleteRows (<span class="keywordtype">long</span> first, <span class="keywordtype">long</span> number)
<a name="l00847"></a>00847   {
<a name="l00848"></a>00848     <span class="comment">// the following is an ugly workaround for a bug in g++ v3.0 that</span>
<a name="l00849"></a>00849     <span class="comment">// does not erase vector elements cleanly in this case.</span>
<a name="l00850"></a>00850 
<a name="l00851"></a>00851     <span class="keywordtype">size_t</span> N(m_data.size());
<a name="l00852"></a>00852     <span class="keywordtype">int</span> newSize(N - number);      
<a name="l00853"></a>00853     std::vector&lt;std::valarray&lt;T&gt; &gt; __tmp(newSize);
<a name="l00854"></a>00854 
<a name="l00855"></a>00855     <span class="keywordtype">int</span> lastDeleted( number + first - 1 );
<a name="l00856"></a>00856     <span class="keywordtype">int</span> firstDeleted(first);
<a name="l00857"></a>00857     <span class="keywordtype">int</span> count(0);
<a name="l00858"></a>00858         {
<a name="l00859"></a>00859                 <span class="keywordflow">for</span> ( <span class="keywordtype">size_t</span> j = 1; j &lt;= N; ++j)
<a name="l00860"></a>00860                 {
<a name="l00861"></a>00861                         <span class="keywordflow">if</span> (  (j - firstDeleted)*(lastDeleted - j) &gt;= 0 )       
<a name="l00862"></a>00862                         {                ++count; 
<a name="l00863"></a>00863                         } 
<a name="l00864"></a>00864                         <span class="keywordflow">else</span>
<a name="l00865"></a>00865                         {
<a name="l00866"></a>00866                                 __tmp[j - 1 - count].resize(m_data[j - 1].size());
<a name="l00867"></a>00867                                 __tmp[j - 1 - count] = m_data[j - 1];
<a name="l00868"></a>00868                         }
<a name="l00869"></a>00869                 }                           
<a name="l00870"></a>00870     }
<a name="l00871"></a>00871 
<a name="l00872"></a>00872     m_data.clear();
<a name="l00873"></a>00873     m_data.resize(newSize);
<a name="l00874"></a>00874         {
<a name="l00875"></a>00875                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; newSize; ++j)
<a name="l00876"></a>00876                 {
<a name="l00877"></a>00877                         m_data[j].resize(__tmp[j].size());
<a name="l00878"></a>00878                         m_data[j] = __tmp[j];
<a name="l00879"></a>00879                 }
<a name="l00880"></a>00880         }
<a name="l00881"></a>00881   }
<a name="l00882"></a>00882 
<a name="l00883"></a>00883   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00884"></a>00884   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::setDataLimits (T* limits)
<a name="l00885"></a>00885   {
<a name="l00886"></a>00886     m_minLegalValue = limits[0];
<a name="l00887"></a>00887     m_maxLegalValue = limits[1];
<a name="l00888"></a>00888     m_minDataValue = std::max(limits[2],limits[0]);
<a name="l00889"></a>00889     m_maxDataValue = std::min(limits[3],limits[1]);
<a name="l00890"></a>00890   }
<a name="l00891"></a>00891 
<a name="l00892"></a>00892   <span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;
<a name="l00893"></a>00893   <span class="keywordtype">void</span> ColumnVectorData&lt;T&gt;::doWrite (T* array, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, T* nullValue)
<a name="l00894"></a>00894   {
<a name="l00895"></a>00895     <span class="keywordtype">int</span> status(0);
<a name="l00896"></a>00896     <span class="comment">// internal functioning of write_colnull forbids its use for writing</span>
<a name="l00897"></a>00897     <span class="comment">// variable width columns. If a nullvalue argument was supplied it will</span>
<a name="l00898"></a>00898     <span class="comment">// be ignored.</span>
<a name="l00899"></a>00899     <span class="keywordflow">if</span> ( !<a class="code" href="classCCfits_1_1Column.html#a7e6589bf0f95eaefc52eeb5c1a119b44" title="boolean, set to true if Column has variable length vector rows.">varLength</a>())
<a name="l00900"></a>00900     {
<a name="l00901"></a>00901         <span class="keywordflow">if</span> (fits_write_colnull(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>(),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(),row, firstElem, rowSize,
<a name="l00902"></a>00902                     array, nullValue,&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00903"></a>00903     }
<a name="l00904"></a>00904     <span class="keywordflow">else</span>
<a name="l00905"></a>00905     {
<a name="l00906"></a>00906         <span class="keywordflow">if</span> (fits_write_col(<a class="code" href="classCCfits_1_1Column.html#ad79fd54bd8997985b37cb6722777c4c0" title="fits pointer corresponding to fits file containing column data.">fitsPointer</a>(),abs(<a class="code" href="classCCfits_1_1Column.html#a005f5d623d129e979d3ba1bd2bd0be17" title="returns the data type of the column">type</a>()),<a class="code" href="classCCfits_1_1Column.html#ab5c2c865112b6610e89bb0829e35c6dd" title="get the Column index (the n in TTYPEn etc).">index</a>(),row,firstElem,rowSize,
<a name="l00907"></a>00907                     array,&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00908"></a>00908 
<a name="l00909"></a>00909     }
<a name="l00910"></a>00910   }
<a name="l00911"></a>00911 
<a name="l00912"></a>00912   <span class="comment">// Additional Declarations</span>
<a name="l00913"></a>00913 
<a name="l00914"></a>00914   <span class="comment">// all functions that operate on complex data that call cfitsio </span>
<a name="l00915"></a>00915   <span class="comment">// need to be specialized. The signature containing complex&lt;T&gt;* objects</span>
<a name="l00916"></a>00916   <span class="comment">// is unfortunate, perhaps, for this purpose, but the user will  access</span>
<a name="l00917"></a>00917   <span class="comment">// rw operations through standard library containers.</span>
<a name="l00918"></a>00918 
<a name="l00919"></a>00919 
<a name="l00920"></a>00920 
<a name="l00921"></a>00921 
<a name="l00922"></a>00922 
<a name="l00923"></a>00923 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l00924"></a>00924 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l00925"></a>00925 <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;float&gt; &gt;::setDataLimits (complex&lt;float&gt;* limits)
<a name="l00926"></a>00926         {
<a name="l00927"></a>00927                 m_minLegalValue = limits[0];
<a name="l00928"></a>00928                 m_maxLegalValue = limits[1];
<a name="l00929"></a>00929                 m_minDataValue =  limits[2];
<a name="l00930"></a>00930                 m_maxDataValue =  limits[3];
<a name="l00931"></a>00931         }
<a name="l00932"></a>00932 <span class="preprocessor">#else</span>
<a name="l00933"></a>00933 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l00934"></a>00934   <span class="keywordtype">void</span> 
<a name="l00935"></a>00935   ColumnVectorData&lt;complex&lt;float&gt; &gt;::setDataLimits (complex&lt;float&gt;* limits);
<a name="l00936"></a>00936 <span class="preprocessor">#endif</span>
<a name="l00937"></a>00937 <span class="preprocessor"></span>
<a name="l00938"></a>00938 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l00939"></a>00939 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l00940"></a>00940 <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;double&gt; &gt;::setDataLimits (complex&lt;double&gt;* limits)
<a name="l00941"></a>00941         {
<a name="l00942"></a>00942                 m_minLegalValue = limits[0];
<a name="l00943"></a>00943                 m_maxLegalValue = limits[1];
<a name="l00944"></a>00944                 m_minDataValue =  limits[2];
<a name="l00945"></a>00945                 m_maxDataValue =  limits[3];
<a name="l00946"></a>00946         }
<a name="l00947"></a>00947 <span class="preprocessor">#else</span>
<a name="l00948"></a>00948 <span class="preprocessor"></span> <span class="keyword">template</span> &lt;&gt;
<a name="l00949"></a>00949    <span class="keywordtype">void</span> 
<a name="l00950"></a>00950    ColumnVectorData&lt;complex&lt;double&gt; &gt;::setDataLimits (complex&lt;double&gt;* limits);
<a name="l00951"></a>00951 <span class="preprocessor">#endif</span>
<a name="l00952"></a>00952 <span class="preprocessor"></span>
<a name="l00953"></a>00953 
<a name="l00954"></a>00954 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l00955"></a>00955 <span class="preprocessor"></span>        <span class="keyword">template</span> &lt;&gt;
<a name="l00956"></a>00956         <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;std::complex&lt;float&gt; &gt;::readColumnData(<span class="keywordtype">long</span> firstRow, 
<a name="l00957"></a>00957                                 <span class="keywordtype">long</span> nelements, <span class="keywordtype">long</span> firstElem, std::complex&lt;float&gt;* null )
<a name="l00958"></a>00958         {
<a name="l00959"></a>00959             <span class="keywordtype">int</span>   status=0;
<a name="l00960"></a>00960             <span class="keywordtype">float</span> nulval (0);
<a name="l00961"></a>00961             FITSUtil::auto_array_ptr&lt;float&gt; pArray(<span class="keyword">new</span> <span class="keywordtype">float</span>[2*nelements]); 
<a name="l00962"></a>00962             <span class="keywordtype">float</span>*     array = pArray.get();
<a name="l00963"></a>00963             <span class="keywordtype">int</span>    anynul(0);
<a name="l00964"></a>00964 
<a name="l00965"></a>00965             <span class="keywordflow">if</span> (fits_read_col_cmp(fitsPointer(),index(),firstRow, firstElem,
<a name="l00966"></a>00966                             nelements,nulval,array,&amp;anynul,&amp;status) ) <span class="keywordflow">throw</span> FitsError(status);
<a name="l00967"></a>00967 
<a name="l00968"></a>00968             <span class="keywordflow">if</span> (m_data.size() != <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(rows())) m_data.resize(rows());
<a name="l00969"></a>00969 
<a name="l00970"></a>00970             std::valarray&lt;std::complex&lt;float&gt; &gt; readData(nelements);
<a name="l00971"></a>00971             <span class="keywordflow">for</span> (<span class="keywordtype">long</span> j = 0; j &lt; nelements; ++j)
<a name="l00972"></a>00972             {
<a name="l00973"></a>00973                     readData[j] = std::complex&lt;float&gt;(array[2*j],array[2*j+1]);
<a name="l00974"></a>00974             }
<a name="l00975"></a>00975             <span class="keywordtype">size_t</span> countRead = 0;
<a name="l00976"></a>00976             <span class="keyword">const</span> <span class="keywordtype">size_t</span> ONE = 1;
<a name="l00977"></a>00977 
<a name="l00978"></a>00978             <span class="keywordflow">if</span> (m_data.size() != <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(rows())) m_data.resize(rows());
<a name="l00979"></a>00979             <span class="keywordtype">size_t</span> vectorSize(0);
<a name="l00980"></a>00980             <span class="keywordflow">if</span> (!varLength())
<a name="l00981"></a>00981             {
<a name="l00982"></a>00982                  vectorSize = std::max(repeat(),ONE); <span class="comment">// safety check.</span>
<a name="l00983"></a>00983             }
<a name="l00984"></a>00984             <span class="keywordflow">else</span>
<a name="l00985"></a>00985             {
<a name="l00986"></a>00986                  <span class="comment">// assume that the user specified the correct length for </span>
<a name="l00987"></a>00987                  <span class="comment">// variable columns. This should be ok since readVariableColumns</span>
<a name="l00988"></a>00988                  <span class="comment">// uses fits_read_descripts to return this information from the</span>
<a name="l00989"></a>00989                  <span class="comment">// fits pointer, and this is passed as nelements here.</span>
<a name="l00990"></a>00990                  vectorSize = nelements;       
<a name="l00991"></a>00991             }
<a name="l00992"></a>00992             <span class="keywordtype">size_t</span> n = nelements; 
<a name="l00993"></a>00993 
<a name="l00994"></a>00994             <span class="keywordtype">int</span> i = firstRow;
<a name="l00995"></a>00995             <span class="keywordtype">int</span> ii = i - 1;
<a name="l00996"></a>00996             <span class="keywordflow">while</span> ( countRead &lt; n)
<a name="l00997"></a>00997             {
<a name="l00998"></a>00998                     std::valarray&lt;complex&lt;float&gt; &gt;&amp; current = m_data[ii];
<a name="l00999"></a>00999                     <span class="keywordflow">if</span> (current.size() != vectorSize) current.resize(vectorSize,0.);
<a name="l01000"></a>01000                     <span class="keywordtype">int</span> elementsInFirstRow = vectorSize-firstElem + 1;
<a name="l01001"></a>01001                     <span class="keywordtype">bool</span> lastRow = ( (nelements - countRead) &lt; vectorSize);
<a name="l01002"></a>01002                     <span class="keywordflow">if</span> (lastRow)
<a name="l01003"></a>01003                     {
<a name="l01004"></a>01004                             <span class="keywordtype">int</span> elementsInLastRow = nelements - countRead;
<a name="l01005"></a>01005                             std::copy(&amp;readData[countRead],&amp;readData[0]+nelements,&amp;current[0]);
<a name="l01006"></a>01006                             countRead += elementsInLastRow;
<a name="l01007"></a>01007                     }             
<a name="l01008"></a>01008                     <span class="comment">// what to do with complete rows. if firstElem == 1 the </span>
<a name="l01009"></a>01009                     <span class="keywordflow">else</span> 
<a name="l01010"></a>01010                     {
<a name="l01011"></a>01011                             <span class="keywordflow">if</span> (firstElem == 1 || (firstElem &gt; 1 &amp;&amp; i &gt; firstRow) )
<a name="l01012"></a>01012                             {
<a name="l01013"></a>01013                                     current = readData[std::slice(vectorSize*(ii-firstRow)+
<a name="l01014"></a>01014                                                                elementsInFirstRow,vectorSize,1)];
<a name="l01015"></a>01015                                     ++ii;
<a name="l01016"></a>01016                                     ++i;
<a name="l01017"></a>01017                                     countRead += vectorSize;   
<a name="l01018"></a>01018                             }   
<a name="l01019"></a>01019                             <span class="keywordflow">else</span>
<a name="l01020"></a>01020                             { 
<a name="l01021"></a>01021                                     <span class="keywordflow">if</span> (i == firstRow)
<a name="l01022"></a>01022                                     {
<a name="l01023"></a>01023                                             std::copy(&amp;readData[0],&amp;readData[0]+elementsInFirstRow,
<a name="l01024"></a>01024                                                                             &amp;current[firstElem]);
<a name="l01025"></a>01025                                             countRead += elementsInFirstRow;
<a name="l01026"></a>01026                                             ++i;
<a name="l01027"></a>01027                                             ++ii;
<a name="l01028"></a>01028                                     }
<a name="l01029"></a>01029                             }
<a name="l01030"></a>01030                     }
<a name="l01031"></a>01031             }
<a name="l01032"></a>01032     }
<a name="l01033"></a>01033 <span class="preprocessor">#else</span>
<a name="l01034"></a>01034 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l01035"></a>01035 <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;float&gt; &gt;::readColumnData(<span class="keywordtype">long</span> firstRow, 
<a name="l01036"></a>01036                         <span class="keywordtype">long</span> nelements, 
<a name="l01037"></a>01037                         <span class="keywordtype">long</span> firstElem, complex&lt;float&gt;* null);
<a name="l01038"></a>01038 <span class="preprocessor">#endif</span>
<a name="l01039"></a>01039 <span class="preprocessor"></span>
<a name="l01040"></a>01040 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l01041"></a>01041 <span class="preprocessor"></span>    <span class="keyword">template</span> &lt;&gt;
<a name="l01042"></a>01042     <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;double&gt; &gt;::readColumnData (<span class="keywordtype">long</span> firstRow, 
<a name="l01043"></a>01043               <span class="keywordtype">long</span> nelements,<span class="keywordtype">long</span> firstElem, 
<a name="l01044"></a>01044               complex&lt;double&gt;* nullValue)
<a name="l01045"></a>01045     {
<a name="l01046"></a>01046 
<a name="l01047"></a>01047         <span class="comment">// duplicated for each complex type to work around imagined or</span>
<a name="l01048"></a>01048         <span class="comment">// actual compiler deficiencies.</span>
<a name="l01049"></a>01049             <span class="keywordtype">int</span>   status=0;
<a name="l01050"></a>01050             <span class="keywordtype">double</span> nulval (0);
<a name="l01051"></a>01051             FITSUtil::auto_array_ptr&lt;double&gt; pArray(<span class="keyword">new</span> <span class="keywordtype">double</span>[2*nelements]); 
<a name="l01052"></a>01052             <span class="keywordtype">double</span>*     array = pArray.get();
<a name="l01053"></a>01053             <span class="keywordtype">int</span>    anynul(0);
<a name="l01054"></a>01054 
<a name="l01055"></a>01055             <span class="keywordflow">if</span> (fits_read_col_dblcmp(fitsPointer(),index(),firstRow, firstElem,
<a name="l01056"></a>01056                             nelements,nulval,array,&amp;anynul,&amp;status) ) <span class="keywordflow">throw</span> FitsError(status);
<a name="l01057"></a>01057 
<a name="l01058"></a>01058             <span class="keywordflow">if</span> (m_data.size() != <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(rows())) m_data.resize(rows());
<a name="l01059"></a>01059 
<a name="l01060"></a>01060             std::valarray&lt;std::complex&lt;double&gt; &gt; readData(nelements);
<a name="l01061"></a>01061             <span class="keywordflow">for</span> (<span class="keywordtype">long</span> j = 0; j &lt; nelements; ++j)
<a name="l01062"></a>01062             {
<a name="l01063"></a>01063                     readData[j] = std::complex&lt;double&gt;(array[2*j],array[2*j+1]);
<a name="l01064"></a>01064             }
<a name="l01065"></a>01065             <span class="keywordtype">size_t</span> countRead = 0;
<a name="l01066"></a>01066             <span class="keyword">const</span> <span class="keywordtype">size_t</span> ONE = 1;
<a name="l01067"></a>01067 
<a name="l01068"></a>01068             <span class="keywordflow">if</span> (m_data.size() != <span class="keyword">static_cast&lt;</span><span class="keywordtype">size_t</span><span class="keyword">&gt;</span>(rows())) m_data.resize(rows());
<a name="l01069"></a>01069             <span class="keywordtype">size_t</span> vectorSize(0);
<a name="l01070"></a>01070             <span class="keywordflow">if</span> (!varLength())
<a name="l01071"></a>01071             {
<a name="l01072"></a>01072                  vectorSize = std::max(repeat(),ONE); <span class="comment">// safety check.</span>
<a name="l01073"></a>01073             }
<a name="l01074"></a>01074             <span class="keywordflow">else</span>
<a name="l01075"></a>01075             {
<a name="l01076"></a>01076                  <span class="comment">// assume that the user specified the correct length for </span>
<a name="l01077"></a>01077                  <span class="comment">// variable columns. This should be ok since readVariableColumns</span>
<a name="l01078"></a>01078                  <span class="comment">// uses fits_read_descripts to return this information from the</span>
<a name="l01079"></a>01079                  <span class="comment">// fits pointer, and this is passed as nelements here.</span>
<a name="l01080"></a>01080                  vectorSize = nelements;       
<a name="l01081"></a>01081             }
<a name="l01082"></a>01082             <span class="keywordtype">size_t</span> n = nelements; 
<a name="l01083"></a>01083 
<a name="l01084"></a>01084             <span class="keywordtype">int</span> i = firstRow;
<a name="l01085"></a>01085             <span class="keywordtype">int</span> ii = i - 1;
<a name="l01086"></a>01086             <span class="keywordflow">while</span> ( countRead &lt; n)
<a name="l01087"></a>01087             {
<a name="l01088"></a>01088                     std::valarray&lt;std::complex&lt;double&gt; &gt;&amp; current = m_data[ii];
<a name="l01089"></a>01089                     <span class="keywordflow">if</span> (current.size() != vectorSize) current.resize(vectorSize,0.);
<a name="l01090"></a>01090                     <span class="keywordtype">int</span> elementsInFirstRow = vectorSize-firstElem + 1;
<a name="l01091"></a>01091                     <span class="keywordtype">bool</span> lastRow = ( (nelements - countRead) &lt; vectorSize);
<a name="l01092"></a>01092                     <span class="keywordflow">if</span> (lastRow)
<a name="l01093"></a>01093                     {
<a name="l01094"></a>01094                             <span class="keywordtype">int</span> elementsInLastRow = nelements - countRead;
<a name="l01095"></a>01095                             std::copy(&amp;readData[countRead],&amp;readData[0]+nelements,&amp;current[0]);
<a name="l01096"></a>01096                             countRead += elementsInLastRow;
<a name="l01097"></a>01097                     }             
<a name="l01098"></a>01098                     <span class="comment">// what to do with complete rows. if firstElem == 1 the </span>
<a name="l01099"></a>01099                     <span class="keywordflow">else</span> 
<a name="l01100"></a>01100                     {
<a name="l01101"></a>01101                             <span class="keywordflow">if</span> (firstElem == 1 || (firstElem &gt; 1 &amp;&amp; i &gt; firstRow) )
<a name="l01102"></a>01102                             {
<a name="l01103"></a>01103                                     current = readData[std::slice(vectorSize*(ii-firstRow)+
<a name="l01104"></a>01104                                                                elementsInFirstRow,vectorSize,1)];
<a name="l01105"></a>01105                                     ++ii;
<a name="l01106"></a>01106                                     ++i;
<a name="l01107"></a>01107                                     countRead += vectorSize;   
<a name="l01108"></a>01108                             }   
<a name="l01109"></a>01109                             <span class="keywordflow">else</span>
<a name="l01110"></a>01110                             { 
<a name="l01111"></a>01111                                     <span class="keywordflow">if</span> (i == firstRow)
<a name="l01112"></a>01112                                     {
<a name="l01113"></a>01113                                             std::copy(&amp;readData[0],&amp;readData[0]+elementsInFirstRow,
<a name="l01114"></a>01114                                                                             &amp;current[firstElem]);
<a name="l01115"></a>01115                                             countRead += elementsInFirstRow;
<a name="l01116"></a>01116                                             ++i;
<a name="l01117"></a>01117                                             ++ii;
<a name="l01118"></a>01118                                     }
<a name="l01119"></a>01119                             }
<a name="l01120"></a>01120                     }
<a name="l01121"></a>01121             }
<a name="l01122"></a>01122     }
<a name="l01123"></a>01123 <span class="preprocessor">#else</span>
<a name="l01124"></a>01124 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l01125"></a>01125 <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;double&gt; &gt;::readColumnData (<span class="keywordtype">long</span> firstRow, 
<a name="l01126"></a>01126                         <span class="keywordtype">long</span> nelements,
<a name="l01127"></a>01127                         <span class="keywordtype">long</span> firstElem, complex&lt;double&gt;* null);
<a name="l01128"></a>01128 <span class="preprocessor">#endif</span>
<a name="l01129"></a>01129 <span class="preprocessor"></span>
<a name="l01130"></a>01130 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l01131"></a>01131 <span class="preprocessor"></span>        <span class="keyword">template</span> &lt;&gt;
<a name="l01132"></a>01132         <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;float&gt; &gt;::writeFixedArray 
<a name="l01133"></a>01133                         (complex&lt;float&gt;* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, 
<a name="l01134"></a>01134                          complex&lt;float&gt;* nullValue)
<a name="l01135"></a>01135         {
<a name="l01136"></a>01136 
<a name="l01137"></a>01137                 <span class="keywordtype">int</span> status(0);
<a name="l01138"></a>01138 
<a name="l01139"></a>01139     <span class="comment">// check for sanity of inputs, then write to file.</span>
<a name="l01140"></a>01140     <span class="comment">// this function writes only complete rows to a table with</span>
<a name="l01141"></a>01141     <span class="comment">// fixed width rows.</span>
<a name="l01142"></a>01142 
<a name="l01143"></a>01143 
<a name="l01144"></a>01144                 <span class="keywordflow">if</span> ( nElements &lt; nRows*static_cast&lt;long&gt;(repeat()) )
<a name="l01145"></a>01145                 {
<a name="l01146"></a>01146 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l01147"></a>01147 <span class="preprocessor"></span>                        std::ostrstream msgStr;
<a name="l01148"></a>01148 <span class="preprocessor">#else</span>
<a name="l01149"></a>01149 <span class="preprocessor"></span>                        std::ostringstream msgStr;
<a name="l01150"></a>01150 <span class="preprocessor">#endif</span>
<a name="l01151"></a>01151 <span class="preprocessor"></span>                        msgStr &lt;&lt; <span class="stringliteral">&quot; input array size: &quot;</span> &lt;&lt; nElements 
<a name="l01152"></a>01152                                         &lt;&lt; <span class="stringliteral">&quot; required &quot;</span> &lt;&lt; nRows*repeat();
<a name="l01153"></a>01153 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l01154"></a>01154 <span class="preprocessor"></span>                        msgStr &lt;&lt; std::ends;
<a name="l01155"></a>01155 <span class="preprocessor">#endif</span>
<a name="l01156"></a>01156 <span class="preprocessor"></span>
<a name="l01157"></a>01157 
<a name="l01158"></a>01158                         String msg(msgStr.str());
<a name="l01159"></a>01159 
<a name="l01160"></a>01160                         <span class="keywordflow">throw</span> Column::InsufficientElements(msg);
<a name="l01161"></a>01161                 } 
<a name="l01162"></a>01162 
<a name="l01163"></a>01163                 FITSUtil::auto_array_ptr&lt;float&gt; realData(<span class="keyword">new</span> <span class="keywordtype">float</span>[2*nElements]);
<a name="l01164"></a>01164 
<a name="l01165"></a>01165                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; nElements; ++j)
<a name="l01166"></a>01166                 {
<a name="l01167"></a>01167                         realData[2*j] = data[j].real();
<a name="l01168"></a>01168                         realData[2*j+1] = data[j].imag();       
<a name="l01169"></a>01169                 }
<a name="l01170"></a>01170 
<a name="l01171"></a>01171 
<a name="l01172"></a>01172 
<a name="l01173"></a>01173                 <span class="keywordflow">if</span> (fits_write_col_cmp(fitsPointer(),index(),firstRow,
<a name="l01174"></a>01174                         1,nElements,realData.get(),&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l01175"></a>01175 
<a name="l01176"></a>01176                 parent()-&gt;updateRows();
<a name="l01177"></a>01177         }
<a name="l01178"></a>01178 <span class="preprocessor">#else</span>
<a name="l01179"></a>01179 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l01180"></a>01180 <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;float&gt; &gt;::writeFixedArray 
<a name="l01181"></a>01181      (complex&lt;float&gt;* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, std::complex&lt;float&gt;* null);
<a name="l01182"></a>01182 <span class="preprocessor">#endif</span>
<a name="l01183"></a>01183 <span class="preprocessor"></span>
<a name="l01184"></a>01184 <span class="preprocessor">#if SPEC_TEMPLATE_IMP_DEFECT || SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l01185"></a>01185 <span class="preprocessor"></span>        <span class="keyword">template</span> &lt;&gt;
<a name="l01186"></a>01186         <span class="keyword">inline</span> <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;double&gt; &gt;::writeFixedArray 
<a name="l01187"></a>01187                         (complex&lt;double&gt;* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, 
<a name="l01188"></a>01188                          complex&lt;double&gt;* nullValue)
<a name="l01189"></a>01189         {
<a name="l01190"></a>01190                 <span class="keywordtype">int</span> status(0);
<a name="l01191"></a>01191 
<a name="l01192"></a>01192     <span class="comment">// check for sanity of inputs, then write to file.</span>
<a name="l01193"></a>01193     <span class="comment">// this function writes only complete rows to a table with</span>
<a name="l01194"></a>01194     <span class="comment">// fixed width rows.</span>
<a name="l01195"></a>01195 
<a name="l01196"></a>01196 
<a name="l01197"></a>01197                 <span class="keywordflow">if</span> ( nElements &lt; nRows*static_cast&lt;long&gt;(repeat()) )
<a name="l01198"></a>01198                 {
<a name="l01199"></a>01199 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l01200"></a>01200 <span class="preprocessor"></span>                        std::ostrstream msgStr;
<a name="l01201"></a>01201 <span class="preprocessor">#else</span>
<a name="l01202"></a>01202 <span class="preprocessor"></span>                        std::ostringstream msgStr;
<a name="l01203"></a>01203 <span class="preprocessor">#endif</span>
<a name="l01204"></a>01204 <span class="preprocessor"></span>                        msgStr &lt;&lt; <span class="stringliteral">&quot; input array size: &quot;</span> &lt;&lt; nElements 
<a name="l01205"></a>01205                                         &lt;&lt; <span class="stringliteral">&quot; required &quot;</span> &lt;&lt; nRows*repeat();
<a name="l01206"></a>01206 <span class="preprocessor">#ifdef SSTREAM_DEFECT</span>
<a name="l01207"></a>01207 <span class="preprocessor"></span>                        msgStr &lt;&lt; std::ends;
<a name="l01208"></a>01208 <span class="preprocessor">#endif</span>
<a name="l01209"></a>01209 <span class="preprocessor"></span>
<a name="l01210"></a>01210                         String msg(msgStr.str());
<a name="l01211"></a>01211 
<a name="l01212"></a>01212                         <span class="keywordflow">throw</span> Column::InsufficientElements(msg);
<a name="l01213"></a>01213                 } 
<a name="l01214"></a>01214 
<a name="l01215"></a>01215                 FITSUtil::auto_array_ptr&lt;double&gt; realData(<span class="keyword">new</span> <span class="keywordtype">double</span>[2*nElements]);
<a name="l01216"></a>01216 
<a name="l01217"></a>01217                 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j &lt; nElements; ++j)
<a name="l01218"></a>01218                 {
<a name="l01219"></a>01219                         realData[2*j] = data[j].real();
<a name="l01220"></a>01220                         realData[2*j+1] = data[j].imag();       
<a name="l01221"></a>01221                 }
<a name="l01222"></a>01222 
<a name="l01223"></a>01223 
<a name="l01224"></a>01224 
<a name="l01225"></a>01225                 <span class="keywordflow">if</span> (fits_write_col_dblcmp(fitsPointer(),index(),firstRow,
<a name="l01226"></a>01226                         1,nElements,realData.get(),&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l01227"></a>01227 
<a name="l01228"></a>01228                 parent()-&gt;updateRows();
<a name="l01229"></a>01229 
<a name="l01230"></a>01230         }
<a name="l01231"></a>01231 <span class="preprocessor">#else</span>
<a name="l01232"></a>01232 <span class="preprocessor"></span><span class="keyword">template</span> &lt;&gt;
<a name="l01233"></a>01233 <span class="keywordtype">void</span> ColumnVectorData&lt;complex&lt;double&gt; &gt;::writeFixedArray 
<a name="l01234"></a>01234                 (complex&lt;double&gt;* data, <span class="keywordtype">long</span> nElements, <span class="keywordtype">long</span> nRows, <span class="keywordtype">long</span> firstRow, 
<a name="l01235"></a>01235                  std::complex&lt;double&gt;* null);
<a name="l01236"></a>01236 <span class="preprocessor">#endif</span>
<a name="l01237"></a>01237 <span class="preprocessor"></span>
<a name="l01238"></a>01238 <span class="preprocessor">#ifdef SPEC_TEMPLATE_DECL_DEFECT</span>
<a name="l01239"></a>01239 <span class="preprocessor"></span>  <span class="keyword">template</span> &lt;&gt;
<a name="l01240"></a>01240   <span class="keyword">inline</span> <span class="keywordtype">void</span>  
<a name="l01241"></a>01241   ColumnVectorData&lt;std::complex&lt;float&gt; &gt;::doWrite 
<a name="l01242"></a>01242   (std::complex&lt;float&gt;* data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, std::complex&lt;float&gt;* nullValue )
<a name="l01243"></a>01243   {
<a name="l01244"></a>01244     <span class="keywordtype">int</span> status(0);
<a name="l01245"></a>01245     FITSUtil::auto_array_ptr&lt;float&gt; carray( <span class="keyword">new</span> <span class="keywordtype">float</span>[2*rowSize]); 
<a name="l01246"></a>01246     <span class="keywordflow">for</span> ( <span class="keywordtype">long</span> j = 0 ; j &lt; rowSize; ++ j)
<a name="l01247"></a>01247       {
<a name="l01248"></a>01248         carray[2*j] = data[j].real();
<a name="l01249"></a>01249         carray[2*j + 1] = data[j].imag();
<a name="l01250"></a>01250       }
<a name="l01251"></a>01251     <span class="keywordflow">if</span> (fits_write_col_cmp(fitsPointer(),index(),row,firstElem,rowSize,
<a name="l01252"></a>01252                            carray.get(),&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l01253"></a>01253   }
<a name="l01254"></a>01254 
<a name="l01255"></a>01255 
<a name="l01256"></a>01256   <span class="keyword">template</span> &lt;&gt;
<a name="l01257"></a>01257   <span class="keyword">inline</span> <span class="keywordtype">void</span>  
<a name="l01258"></a>01258   ColumnVectorData&lt;std::complex&lt;double&gt; &gt;::doWrite
<a name="l01259"></a>01259   (std::complex&lt;double&gt;* data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, std::complex&lt;double&gt;* nullValue )
<a name="l01260"></a>01260   {
<a name="l01261"></a>01261     <span class="keywordtype">int</span> status(0);
<a name="l01262"></a>01262     FITSUtil::auto_array_ptr&lt;double&gt; carray( <span class="keyword">new</span> <span class="keywordtype">double</span>[2*rowSize]); 
<a name="l01263"></a>01263     <span class="keywordflow">for</span> ( <span class="keywordtype">long</span> j = 0 ; j &lt; rowSize; ++ j)
<a name="l01264"></a>01264       {
<a name="l01265"></a>01265         carray[2*j] = data[j].real();
<a name="l01266"></a>01266         carray[2*j + 1] = data[j].imag();
<a name="l01267"></a>01267       }
<a name="l01268"></a>01268     <span class="keywordflow">if</span> (fits_write_col_dblcmp(fitsPointer(),index(),row,firstElem,rowSize,
<a name="l01269"></a>01269                               carray.get(),&amp;status)) <span class="keywordflow">throw</span> FitsError(status);
<a name="l01270"></a>01270 
<a name="l01271"></a>01271   }
<a name="l01272"></a>01272 
<a name="l01273"></a>01273 <span class="preprocessor">#else</span>
<a name="l01274"></a>01274 <span class="preprocessor"></span><span class="keyword">template</span>&lt;&gt;
<a name="l01275"></a>01275 <span class="keywordtype">void</span> 
<a name="l01276"></a>01276 ColumnVectorData&lt;complex&lt;float&gt; &gt;::doWrite 
<a name="l01277"></a>01277                 ( complex&lt;float&gt;* data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, complex&lt;float&gt;* nullValue);
<a name="l01278"></a>01278 
<a name="l01279"></a>01279 <span class="keyword">template</span>&lt;&gt;
<a name="l01280"></a>01280 <span class="keywordtype">void</span> 
<a name="l01281"></a>01281 ColumnVectorData&lt;complex&lt;double&gt; &gt;::doWrite 
<a name="l01282"></a>01282                 ( complex&lt;double&gt;* data, <span class="keywordtype">long</span> row, <span class="keywordtype">long</span> rowSize, <span class="keywordtype">long</span> firstElem, complex&lt;double&gt;* nullValue );
<a name="l01283"></a>01283 <span class="preprocessor">#endif</span>
<a name="l01284"></a>01284 <span class="preprocessor"></span>} <span class="comment">// namespace CCfits</span>
<a name="l01285"></a>01285 
<a name="l01286"></a>01286 
<a name="l01287"></a>01287 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"/><address style="text-align: right;"><small>Generated on Wed Sep 9 11:59:40 2009 for CCfits by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.1 </small></address>
</body>
</html>