Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Array2.h « src « v0.6.4 - github.com/moses-smt/mgiza.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8ea2d9e21d7b8bd28e5569b32ea0a8c72cde1a1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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