blob: 546d63a40434954abb57d0a59d111e8071dfa032 [file] [log] [blame]
/*
EGYPT Toolkit for Statistical Machine Translation
Written by Yaser Al-Onaizan, Jan Curin, Michael Jahr, Kevin Knight, John Lafferty, Dan Melamed, David Purdy, Franz Och, Noah Smith, and David Yarowsky.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
USA.
*/
/*--
Array2: Implementation of a twodimensional checked array allowing for
a specified underlieing one-dimensional data-structure.
Franz Josef Och (30/07/99)
--*/
#ifndef CLASS_Array2_DEFINED
#define CLASS_Array2_DEFINED
#include "mystl.h"
#include <string>
#include <vector>
template<class T, class Y=vector<T> > class Array2
{
private:
Y p;
// short h1, h2;
unsigned int h1, h2;
public:
Array2(unsigned int _h1, unsigned int _h2)
: p(_h1*_h2), h1(_h1), h2(_h2) {}
Array2(unsigned int _h1, unsigned int _h2, const T&_init)
: p(_h1*_h2, _init), h1(_h1), h2(_h2) {}
Array2()
: h1(0), h2(0) {}
inline T &operator()(unsigned int i, unsigned int j)
{ assert(i<h1);assert(j<h2);return p[i*h2+j]; }
inline const T&operator()(unsigned int i, unsigned int j) const
{ assert(i<h1);assert(j<h2);return p[i*h2+j]; }
inline T get(unsigned int i, unsigned int j)
{ assert(i<h1);assert(j<h2);return p[i*h2+j]; }
inline void set(unsigned int i, unsigned int j, T x)
{ assert(i<h1);assert(j<h2);p[i*h2+j]=x; }
inline const T get(unsigned int i, unsigned int j) const
{ assert(i<h1);assert(j<h2);return p[i*h2+j]; }
inline unsigned int getLen1() const
{ return h1; }
inline unsigned int getLen2() const
{ return h2; }
inline T*begin(){
if( h1==0||h2==0)return 0;
return &(p[0]);
}
inline T*end(){
if( h1==0||h2==0)return 0;
return &(p[0])+p.size();
}
inline const T*begin()const{ return p.begin(); }
inline const T*end()const{return p.end();}
friend ostream&operator<<(ostream&out, const Array2<T, Y>&ar)
{
for(unsigned int i=0;i<ar.getLen1();i++)
{
//out << i << ": ";
for(unsigned int j=0;j<ar.getLen2();j++)
out << ar(i, j) << ' ';
out << '\n';
}
return out << endl;
}
inline void resize(unsigned int a,unsigned int b)
{
if( !(a==h1&&b==h2))
{
h1=a;
h2=b;
p.resize(h1*h2);
}
}
inline void resize(unsigned int a,unsigned int b,const T&t)
{
if( !(a==h1&&b==h2))
{
h1=a;
h2=b;
p.resize(h1*h2);
fill(p.begin(),p.end(),t);
}
}
};
#endif