concordia-server/mgiza-aligner/mgiza/mgizapp/src/Array2.h
2017-01-21 17:07:36 +01:00

128 lines
3.1 KiB
C++

/*
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
{
public:
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