//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;

namespace MatrixMultiplication
{
	/// <summary>
	/// Podsumowanie dla Matrix.
	/// </summary>
	public abstract class MatrixMultiply
	{
		protected double [,] A;
		protected double [,] B;
		// Wynik
		protected double [,] C;
		public MatrixMultiply()
		{
		}
		public MatrixMultiply(double [,] A, double [,] B)
		{
			if(A.GetLength(0) != B.GetLength(1) ||
			   A.GetLength(1) != B.GetLength(0))
				throw new ArgumentOutOfRangeException("Macierze mają niezgodne wymiary");

			this.A = new double[A.GetLength(0), A.GetLength(1)];
			this.B = new double[B.GetLength(0), B.GetLength(1)];
			for(int i = 0; i < A.GetLength(0); i++)
				for(int j = 0; j < A.GetLength(1); j++)
					this.A[i,j] = A[i,j];

			for(int i = 0; i < B.GetLength(0); i++)
				for(int j = 0; j < B.GetLength(1); j++)
					this.B[i,j] = B[i,j];
			this.C = new double[A.GetLength(0), B.GetLength(1)];
		}
		public abstract double [,] Multiply();
		public double [,] Multiply(double [,] A, double [,] B)
		{
			if(A.GetLength(0) != B.GetLength(1) ||
				A.GetLength(1) != B.GetLength(0))
				throw new ArgumentOutOfRangeException("The two matrixes have incompatible dimensions");

			this.A = new double[A.GetLength(0), A.GetLength(1)];
			this.B = new double[B.GetLength(0), B.GetLength(1)];
			for(int i = 0; i < A.GetLength(0); i++)
				for(int j = 0; j < A.GetLength(1); j++)
					this.A[i,j] = A[i,j];

			for(int i = 0; i < B.GetLength(0); i++)
				for(int j = 0; j < B.GetLength(1); j++)
					this.B[i,j] = B[i,j];
			this.C = new double[A.GetLength(0), B.GetLength(1)];
			return Multiply();
		}
	}
}
