| /* |
| |
| 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 |