diff options
Diffstat (limited to 'mgizapp/src/Array2.h')
-rw-r--r-- | mgizapp/src/Array2.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/mgizapp/src/Array2.h b/mgizapp/src/Array2.h new file mode 100644 index 0000000..8ea2d9e --- /dev/null +++ b/mgizapp/src/Array2.h @@ -0,0 +1,126 @@ +/* + + 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 |