diff options
author | Jakob Odersky <jodersky@gmail.com> | 2011-03-12 11:20:07 +0000 |
---|---|---|
committer | Jakob Odersky <jodersky@gmail.com> | 2011-03-12 11:20:07 +0000 |
commit | 042870bbcea4c39e8fbf9f07990dc9d64c92bde1 (patch) | |
tree | 566bdd68dfc72f090a7d07118fbd45866d465f25 /src | |
parent | cc47a21b3c70a8f91ef945e6c127d4f2e3b007da (diff) | |
download | vhc-042870bbcea4c39e8fbf9f07990dc9d64c92bde1.tar.gz vhc-042870bbcea4c39e8fbf9f07990dc9d64c92bde1.tar.bz2 vhc-042870bbcea4c39e8fbf9f07990dc9d64c92bde1.zip |
Reorganisation du repertoire source. Les sources principaux sont dans `src/main' et les tests dans `src/test'.
Diffstat (limited to 'src')
-rw-r--r-- | src/main/Makefile | 35 | ||||
-rw-r--r-- | src/main/Particle.cc | 17 | ||||
-rw-r--r-- | src/main/Particle.h | 38 | ||||
-rw-r--r-- | src/main/Vector3D.cc | 29 | ||||
-rw-r--r-- | src/main/Vector3D.h | 125 | ||||
-rw-r--r-- | src/main/namespace.ccbak | 2 | ||||
-rw-r--r-- | src/test/Makefile | 37 | ||||
-rw-r--r-- | src/test/Vector3DTest.cc | 61 |
8 files changed, 344 insertions, 0 deletions
diff --git a/src/main/Makefile b/src/main/Makefile new file mode 100644 index 0000000..af9deab --- /dev/null +++ b/src/main/Makefile @@ -0,0 +1,35 @@ +######################################################################### +# Makefile recursif # +#=======================================================================# +# Les variables suivantes sont definis dans un makefile plus haut. # +# BASEDIR repertoire de base du projet # +# SRCDIR repertoire contenant le code source # +# BINDIR repertoire ou sont places toutes objets compiles # +######################################################################### + +# Nom du repertoire contenant ce makefile +LOCALDIR = main + +# ==> Ajouter ici les objets a compiler +# Si un objet necessite une compilation non-standard (i.e. pas de regle du style Foo.o : Foo.cc Foo.h), rajouter +# cette regle. +OBJS = Vector3D.o Particle.o + +all: checkdirs lib + +# Verifie l'existance du repertoire de sortie +checkdirs: $(BINDIR)/$(LOCALDIR) + +# Cree le repertoire de sortie +$(BINDIR)/$(LOCALDIR): + @mkdir -p $@ + +# Cree une librairie statique des fichiers objets +lib: $(OBJS) + @echo "Packing library..." + ar rcs $(BINDIR)/$(LOCALDIR)/libvhc.a $(addprefix $(BINDIR)/$(LOCALDIR)/,$(OBJS)) + @echo "Done packing library." + +# Regle implicite qui modifie le repertoire de destination des fichiers .o +%.o: %.cc + $(CXX) $(CXXFLAGS) -c $< -o $(BINDIR)/$(LOCALDIR)/$@
\ No newline at end of file diff --git a/src/main/Particle.cc b/src/main/Particle.cc new file mode 100644 index 0000000..2917449 --- /dev/null +++ b/src/main/Particle.cc @@ -0,0 +1,17 @@ +/* + * Particle.cc + * + * Created on: Mar 9, 2011 + * Author: jakob + */ + +#include "Particle.h" + +namespace vhc { + + +Particle::~Particle() { + // TODO Auto-generated destructor stub +} + +} diff --git a/src/main/Particle.h b/src/main/Particle.h new file mode 100644 index 0000000..128dbb1 --- /dev/null +++ b/src/main/Particle.h @@ -0,0 +1,38 @@ +/* + * Particle.h + * + * Created on: Mar 9, 2011 + * Author: jakob + */ + +#ifndef PARTICLE_H_ +#define PARTICLE_H_ + +#include "Vector3D.h" + +namespace vhc { + +class Particle { + +private: + Vector3D position; + +public: +/* + Vector3D getPosition(); + + Vector3D getVelocity(); + + Vector3D getEnergy(); + + Vector3D getGamma(); + + Vector3D getMomentum(); +*/ + Particle(): position(0, 0, 0) {}; + virtual ~Particle(); +}; + +} + +#endif /* PARTICLE_H_ */ diff --git a/src/main/Vector3D.cc b/src/main/Vector3D.cc new file mode 100644 index 0000000..258922f --- /dev/null +++ b/src/main/Vector3D.cc @@ -0,0 +1,29 @@ +/* + * Vector3D.cc + * + * Created on: Mar 1, 2011 + * Author: Jakob Odersky + */ + +#include <iostream> +#include "Vector3D.h" + +using namespace std; + +namespace vhc { + +Vector3D const Vector3D::Null = Vector3D(0.0, 0.0, 0.0); +Vector3D const Vector3D::i = Vector3D(1.0, 0.0, 0.0); +Vector3D const Vector3D::j = Vector3D(0.0, 1.0, 0.0); +Vector3D const Vector3D::k = Vector3D(0.0, 0.0, 1.0); + +ostream& operator<< (ostream& output, const Vector3D& v) { + output << v.toString(); + return output; +} + +Vector3D operator* (double n, const Vector3D& v) { + return v * n; +} + +} diff --git a/src/main/Vector3D.h b/src/main/Vector3D.h new file mode 100644 index 0000000..042463d --- /dev/null +++ b/src/main/Vector3D.h @@ -0,0 +1,125 @@ +/* + * Vector3D.h + * + * Created on: Mar 1, 2011 + * Author: Jakob Odersky + */ + +#ifndef VECTOR3D_H_ +#define VECTOR3D_H_ + +#include <iostream> +#include <sstream> +#include <math.h> +#include <stdexcept> + +namespace vhc { + +/** Un vecteur de dimension trois. Les instances de cette classes sont completement + * invariables, c'est-a-dire un vecteur une fois initialise, ses composantes ne + * peuvent plus etres modifies. + * Le fait qu'un vecteur ne possede pas d'etat, facilite le raisonement et parait + * surtout naturelle. + * Ainsi, chaque operation sur un vecteur retourne une nouvelle instance. La + * performance perdue ainsi est minimale pour une classe ne contenant que trois + * champs. + */ +class Vector3D { + +private: + /** Composante x. */ + double x; + + /** Composante y. */ + double y; + + /** Composante z. */ + double z; + +public: + + /** Cree une nouvelle instance de <code>Vector3D</code>. + * @param x 1e composante + * @param y 2e composante + * @param z 3e composante + */ + Vector3D(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}; + + /** Retourne la composante x de ce vecteur. */ + double getX() const {return x;}; + + /** Retourne la composante y de ce vecteur. */ + double getY() const {return y;}; + + /** Retourne la composante z de ce vecteur. */ + double getZ() const {return z;}; + + /** Verifie si ce vecteur et le vecteur <code>v</code> sont eqaux, i.e. qu'ils ont les memes composantes. */ + bool operator== (const Vector3D& v) const {return x == v.x && y == v.y && z == v.z;}; + + /** Verifie si ce vecteur et le vecteur <code>v</code> sont differents, i.e. qu'ils ont des composantes differentes. */ + bool operator!= (const Vector3D& v) const {return !((*this) == (v));}; + + /** Addition de vecteurs. Retourne un nouveau vecteur resultant de l'addition de ce vecteur avec <code>v</code>. */ + Vector3D operator+ (const Vector3D& v) const {return Vector3D(x + v.x, y + v.y, z + v.z);}; + + /** Multiplication scalaire. Retourne un nouveau vecteur resultant de la multiplication de ce vecteur par <code>n</code>. */ + Vector3D operator* (double n) const {return Vector3D(x * n, y * n, z * n);}; + + /** Retourne l'oppose de ce vecteur. */ + Vector3D operator-() const {return (*this) * (-1.0);}; + + /** Soustraction de vecteurs. Retourne un nouveau vecteur resultant de la soustraction de ce vecteur avec <code>v</code>. */ + Vector3D operator- (const Vector3D& v) const {return (*this) + -v;}; + + /** Division scalaire. Retourne un nouveau vecteur resultant de la division de ce vecteur par <code>n</code>. */ + Vector3D operator/ (double n) const {return (*this) * (1.0 / n) ;}; + + /** Produit scalaire. Retourne le produit scalaire de ce vecteur avec le vecteur <code>v</code>. */ + double dot(const Vector3D& v) const {return x * v.x + y * v.y + z * v.z;}; + + /** Produit vectoriel. Retourne le produit vectoriel directe (main droite) de ce vecteur avec le vecteur <code>v</code>. + * Nous avons decide de ne pas utiliser l'operateur `^' pour representer le produit vectoriel car sa precedence est plus + * basse que toutes autres operations binaires sur les vecteurs. + */ + Vector3D cross(const Vector3D& v) const {return Vector3D(y * v.z - v.y * z, v.x * z - x * v.z, x * v.y - v.x * y);}; + + /** Vecteur unitaire de ce vecteur. */ + Vector3D operator~() const { + if (getNorm() != 0.0) return (*this) / getNorm(); + else throw std::domain_error("Unit vector."); + }; + + Vector3D getUnit() const {return ~(*this);} + + /** Retourne la norme du vecteur. */ + double getNorm() const {return sqrt(dot(*this));}; + + /** Retourne une representation en chaine de ce vecteur. */ + std::string toString() const { + std::stringstream s; + s << "Vector3D(" << x << ", " << y << ", " << z << ")"; + return s.str(); + }; + + /** Vecteur nulle. (0,0,0) */ + static const Vector3D Null; + + /** Vecteur unitaire, d'axe x. (1, 0, 0) */ + static const Vector3D i; + + /** Vecteur unitaire, d'axe y. (0, 1, 0) */ + static const Vector3D j; + + /** Vecteur unitaire, d'axe z. (0, 0, 1) */ + static const Vector3D k; + +}; + +std::ostream& operator<< (std::ostream& output, const Vector3D& v); + +Vector3D operator* (double n, const Vector3D& v); + +} // namespace + +#endif /* VECTOR3D_H_ */ diff --git a/src/main/namespace.ccbak b/src/main/namespace.ccbak new file mode 100644 index 0000000..52d293c --- /dev/null +++ b/src/main/namespace.ccbak @@ -0,0 +1,2 @@ +/** Espace de nom contenant tout code relatif au projet `Virtual Hadron Collider'. */ +namespace vhc {}; diff --git a/src/test/Makefile b/src/test/Makefile new file mode 100644 index 0000000..e8a9340 --- /dev/null +++ b/src/test/Makefile @@ -0,0 +1,37 @@ +######################################################################### +# Makefile recursif # +#=======================================================================# +# Les variables suivantes sont definis dans un makefile plus haut. # +# BASEDIR repertoire de base du projet # +# SRCDIR repertoire contenant le code source # +# BINDIR repertoire ou sont places toutes objets compiles # +#=======================================================================# +# ==> indique des champs modifiables aisement # +#=======================================================================# +# Comme tous les tests dependent du projet principal, les references au # +# dossier `main' sont autorisees. # +######################################################################### + +# Nom du repertoire contenant ce makefile +LOCALDIR = test + +# ==> Rajouter ici les tests a compiler, i.e. les noms des fichiers tests _sans_ extension +# Si un objet X necessite une compilation non-standard (i.e. pas de regle du style X: X.cc X.h), rajouter cet objet +# en fin de BINS ne suffit pas. Il faut de plus creer une nouvelle regle. +BINS = Vector3DTest + +# Inclure les headers de main (source principale) +CXXFLAGS += -I $(SRCDIR)/main/ + +all: checkdirs $(BINS) + +# Verifie l'existance du repertoire de sortie +checkdirs: $(BINDIR)/$(LOCALDIR) + +# Cree le repertoire de sortie +$(BINDIR)/$(LOCALDIR): + @mkdir -p $@ + +# Regle implicite pour les fichiers sans extension (i.e. pour les executables) +%: %.cc + $(CXX) $(CXXFLAGS) $< -static -L$(BINDIR)/main -lvhc -o $(BINDIR)/$(LOCALDIR)/$@ diff --git a/src/test/Vector3DTest.cc b/src/test/Vector3DTest.cc new file mode 100644 index 0000000..bf4203a --- /dev/null +++ b/src/test/Vector3DTest.cc @@ -0,0 +1,61 @@ +/* + * Vector3DTest.cc + * + * Created on: Mar 1, 2011 + * Author: Jakob Odersky + */ + + +#include <iostream> +#include <assert.h> +#include <iomanip> +#include <limits> +//TODO change relative include +#include "Vector3D.h" + +using namespace std; +using namespace vhc; + + +bool printTest(); + +int main() { + //equality test + assert(Vector3D(1, 2, 3) == Vector3D(1, 2, 3)); + assert(Vector3D(1, 2.4, 3) != Vector3D(1, 2, 3)); + + //addition test + assert(Vector3D(1, -0.9, 57683) + Vector3D(-1, 0.9, -57683) == Vector3D::Null); + + //addition, mutliplication test + assert(Vector3D(4, 0, 16) / 4 == -Vector3D(0.25, 0, 1) * -4); + + //length test + assert(Vector3D(0,3,4).getNorm() == 5); + + bool caught = false; + try { + ~Vector3D::Null; + } catch (domain_error& ex) { + caught = true; + }; + assert(caught == true); + + cout << "Vector3D: tests completed successfully" << endl; + + return 0; +} + +bool printTest() { + cout << "PRINT TEST" << endl; + cout << Vector3D(1,2,3) << endl; + char answer; + do { + cout << "Was 'Vector3D(1,2,3)' displayed? (y/n)" << endl; + cin >> answer; + } while (answer != 'y' && answer != 'n'); + cout << "END PRINT TEST" << endl; + + if (answer == 'y') return true; + else return false; +} |