From 197bcd7f3d80ec69c6c1bff8186407e2794b6d62 Mon Sep 17 00:00:00 2001 From: josh Date: Sun, 5 Apr 2009 13:12:03 +0000 Subject: [PATCH] reworked engine structure, added util/ directory with refptr and Solver, set svn:ignore on subdirs git-svn-id: svn://anubis/jcad/trunk@34 c8684bfa-0c3a-0410-9efb-b8c82542f01e --- src/Makefile | 2 +- src/engine/Constrainable.cc | 2 + src/engine/Constrainable.h | 15 +++++ src/engine/Constraint.cc | 2 + src/engine/Constraint.h | 15 +++++ src/engine/ConstraintSet.cc | 19 ++++++ src/engine/ConstraintSet.h | 24 +++++++ src/engine/Profile.cc | 0 src/engine/Profile.h | 12 ---- src/util/Makefile | 23 +++++++ src/util/Solver.cc | 127 ++++++++++++++++++++++++++++++++++++ src/util/Solver.h | 57 ++++++++++++++++ src/util/refptr.h | 103 +++++++++++++++++++++++++++++ 13 files changed, 388 insertions(+), 13 deletions(-) create mode 100644 src/engine/Constrainable.cc create mode 100644 src/engine/Constrainable.h create mode 100644 src/engine/Constraint.cc create mode 100644 src/engine/Constraint.h create mode 100644 src/engine/ConstraintSet.cc create mode 100644 src/engine/ConstraintSet.h delete mode 100644 src/engine/Profile.cc delete mode 100644 src/engine/Profile.h create mode 100644 src/util/Makefile create mode 100644 src/util/Solver.cc create mode 100644 src/util/Solver.h create mode 100644 src/util/refptr.h diff --git a/src/Makefile b/src/Makefile index b119621..498f710 100644 --- a/src/Makefile +++ b/src/Makefile @@ -16,7 +16,7 @@ export CXXFLAGS := -Wall -O2 \ export LDFLAGS := `pkg-config --libs gtkmm-$(GTKMM_VERSION)` \ `pkg-config --libs gtkglextmm-$(GTKGLEXTMM_VERSION)` -SUBDIRS := engine gui main +SUBDIRS := util engine gui main .PHONY: $(TARGET) $(TARGET): diff --git a/src/engine/Constrainable.cc b/src/engine/Constrainable.cc new file mode 100644 index 0000000..6f9ee1c --- /dev/null +++ b/src/engine/Constrainable.cc @@ -0,0 +1,2 @@ + +#include "Constrainable.h" diff --git a/src/engine/Constrainable.h b/src/engine/Constrainable.h new file mode 100644 index 0000000..59d4dd4 --- /dev/null +++ b/src/engine/Constrainable.h @@ -0,0 +1,15 @@ + +#ifndef CONSTRAINABLE_H +#define CONSTRAINABLE_H CONSTRAINABLE_H + +#include "util/refptr.h" + +class Constrainable +{ + public: + protected: +}; + +typedef refptr ConstrainableRef; + +#endif diff --git a/src/engine/Constraint.cc b/src/engine/Constraint.cc new file mode 100644 index 0000000..b91e5f6 --- /dev/null +++ b/src/engine/Constraint.cc @@ -0,0 +1,2 @@ + +#include "Constraint.h" diff --git a/src/engine/Constraint.h b/src/engine/Constraint.h new file mode 100644 index 0000000..e93e31a --- /dev/null +++ b/src/engine/Constraint.h @@ -0,0 +1,15 @@ + +#ifndef CONSTRAINT_H +#define CONSTRAINT_H CONSTRAINT_H + +#include "util/refptr.h" + +class Constraint +{ + public: + protected: +}; + +typedef refptr ConstraintRef; + +#endif diff --git a/src/engine/ConstraintSet.cc b/src/engine/ConstraintSet.cc new file mode 100644 index 0000000..5b6340b --- /dev/null +++ b/src/engine/ConstraintSet.cc @@ -0,0 +1,19 @@ + +#include "ConstraintSet.h" + +int ConstraintSet::add(refptr c) +{ + m_objects.push_back(c); + return m_objects.size() - 1; +} + +int ConstraintSet::add(refptr c) +{ + m_constraints.push_back(c); + return m_constraints.size() - 1; +} + +int solve() +{ + return 0; +} diff --git a/src/engine/ConstraintSet.h b/src/engine/ConstraintSet.h new file mode 100644 index 0000000..f33520b --- /dev/null +++ b/src/engine/ConstraintSet.h @@ -0,0 +1,24 @@ + +#ifndef CONSTRAINTSET_H +#define CONSTRAINTSET_H CONSTRAINTSET_H + +#include "util/refptr.h" +#include "Constrainable.h" +#include "Constraint.h" +#include + +class ConstraintSet +{ + public: + int add(ConstrainableRef c); + int add(ConstraintRef c); + int solve(); + + protected: + std::vector m_objects; + std::vector m_constraints; +}; + +typedef refptr ConstraintSetRef; + +#endif diff --git a/src/engine/Profile.cc b/src/engine/Profile.cc deleted file mode 100644 index e69de29..0000000 diff --git a/src/engine/Profile.h b/src/engine/Profile.h deleted file mode 100644 index fda59bc..0000000 --- a/src/engine/Profile.h +++ /dev/null @@ -1,12 +0,0 @@ - -#ifndef PROFILE_H -#define PROFILE_H - -class Profile -{ - public: - protected: -}; - -#endif - diff --git a/src/util/Makefile b/src/util/Makefile new file mode 100644 index 0000000..a210eec --- /dev/null +++ b/src/util/Makefile @@ -0,0 +1,23 @@ + +OBJS := $(patsubst %.cc,%.o,$(wildcard *.cc)) +DEPS := $(OBJS:.o=.dep) + +all: $(DEPS) $(OBJS) + +%.o: %.cc + $(CXX) -c -o $@ $(CPPFLAGS) $(CXXFLAGS) $< + +# Make dependency files +%.dep: %.cc + @set -e; rm -f $@; \ + $(CXX) -MM $(CPPFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +clean: + -$(RM) -f *.o *.dep + +# Include dependency files +ifndef CLEAN +-include $(DEPS) +endif diff --git a/src/util/Solver.cc b/src/util/Solver.cc new file mode 100644 index 0000000..0e38237 --- /dev/null +++ b/src/util/Solver.cc @@ -0,0 +1,127 @@ + +#include "Solver.h" +#include + +/* Generic Solver constructor */ +Solver::Solver(double a, double b, double c, double d, double e) +{ + this->a = a; + this->b = b; + this->c = c; + this->d = d; + this->e = e; +} + +Solver::~Solver() +{ +} + +Solver::Result::Result() +{ + numResults = 0; +} + + +/************************************************************************** + * LinearSolver methods * + *************************************************************************/ +LinearSolver::LinearSolver(double a, double b) + : Solver(a, b) +{ +} + +/* solve a linear equation */ +Solver::Result LinearSolver::solve() +{ + /* equation ax + b = 0 */ + Result res; + if (a == 0.0) + { + if (b == 0.0) + { + res.numResults = 1; + res.results[0] = 0.0; + } + else + { + res.numResults = 0; + } + } + else + { + res.numResults = 1; + res.results[0] = -b / a; + } + return res; +} + + +/************************************************************************** + * QuadraticSolver methods * + *************************************************************************/ +QuadraticSolver::QuadraticSolver(double a, double b, double c) + : Solver(a, b, c) +{ +} + +/* solve a quadratic equation */ +Solver::Result QuadraticSolver::solve() +{ + Result res; + double discriminant = b * b - 4 * a * c; + if (discriminant < 0.0) + { + res.numResults = 0; + } + else + { + double sqrt_discriminant = sqrt(discriminant); + double two_a = 2.0 * a; + if (sqrt_discriminant == 0.0) + { + res.numResults = 1; + res.results[0] = (-b) / two_a; + } + else + { + res.numResults = 2; + res.results[0] = (-b - sqrt_discriminant) / two_a; + res.results[1] = (-b + sqrt_discriminant) / two_a; + } + } + + return res; +} + + +/************************************************************************** + * CubicSolver methods * + *************************************************************************/ +CubicSolver::CubicSolver(double a, double b, double c, double d) + : Solver(a, b, c, d) +{ +} + +Solver::Result CubicSolver::solve() +{ + Result res; + /* TODO: fill in */ + return res; +} + + +/************************************************************************** + * QuarticSolver methods * + *************************************************************************/ +QuarticSolver::QuarticSolver(double a, double b, double c, double d, double e) + : Solver(a, b, c, d, e) +{ +} + +Solver::Result QuarticSolver::solve() +{ + Result res; + /* TODO: fill in */ + return res; +} + diff --git a/src/util/Solver.h b/src/util/Solver.h new file mode 100644 index 0000000..ad4b666 --- /dev/null +++ b/src/util/Solver.h @@ -0,0 +1,57 @@ + +#ifndef SOLVER_H +#define SOLVER_H SOLVER_H + +class Solver +{ + public: + class Result + { + public: + Result(); + int numResults; + double results[4]; + }; + + Solver(double a = 0.0, + double b = 0.0, + double c = 0.0, + double d = 0.0, + double e = 0.0); + virtual ~Solver(); + virtual Result solve() = 0; + + protected: + double a, b, c, d, e; +}; + +class LinearSolver : public Solver +{ + public: + LinearSolver(double a, double b); + Result solve(); +}; + +class QuadraticSolver : public Solver +{ + public: + QuadraticSolver(double a, double b, double c); + Result solve(); +}; + +class CubicSolver : public Solver +{ + public: + CubicSolver(double a, double b, double c, double d); + Result solve(); +}; + +class QuarticSolver : public Solver +{ + public: + QuarticSolver(double a, double b, double c, double d, double e); + Result solve(); +}; + +#endif + diff --git a/src/util/refptr.h b/src/util/refptr.h new file mode 100644 index 0000000..1f33df1 --- /dev/null +++ b/src/util/refptr.h @@ -0,0 +1,103 @@ + +#ifndef REFPTR_H +#define REFPTR_H REFPTR_H + +#include /* NULL */ + +template +class refptr +{ + public: + refptr(); + refptr(T * ptr); + refptr(const refptr & orig); + refptr & operator=(const refptr & orig); + refptr & operator=(T * ptr); + ~refptr(); + T & operator*() const; + T * operator->() const; + bool isNull() const { return m_ptr == NULL; } + + private: + void cloneFrom(const refptr & orig); + void destroy(); + + T * m_ptr; + int * m_refCount; +}; + +template refptr::refptr() +{ + m_ptr = NULL; + m_refCount = NULL; +} + +template refptr::refptr(T * ptr) +{ + m_ptr = ptr; + m_refCount = new int; + *m_refCount = 1; +} + +template refptr::refptr(const refptr & orig) +{ + cloneFrom(orig); +} + +template refptr & refptr::operator=(const refptr & orig) +{ + destroy(); + cloneFrom(orig); + return *this; +} + +template refptr & refptr::operator=(T * ptr) +{ + destroy(); + m_ptr = ptr; + m_refCount = new int; + *m_refCount = 1; + return *this; +} + +template void refptr::cloneFrom(const refptr & orig) +{ + this->m_ptr = orig.m_ptr; + this->m_refCount = orig.m_refCount; + if (m_refCount != NULL) + (*m_refCount)++; +} + +template refptr::~refptr() +{ + destroy(); +} + +template void refptr::destroy() +{ + if (m_refCount != NULL) + { + if (*m_refCount <= 1) + { + delete m_ptr; + delete m_refCount; + } + else + { + (*m_refCount)--; + } + } +} + +template T & refptr::operator*() const +{ + return *m_ptr; +} + +template T * refptr::operator->() const +{ + return m_ptr; +} + +#endif +