From 21ce2b7b374b5c287c94a163e979dab312e5b656 Mon Sep 17 00:00:00 2001
From: "W. Spencer Smith" <smiths@mcmaster.ca>
Date: Thu, 15 Mar 2018 17:05:04 -0400
Subject: [PATCH] Experiment with dataset implemented using templates

---
 .../L26_SpecViaUML/DataSetTemplate/Makefile   |  53 ++++++++++++++++++
 .../DataSetTemplate/bin/.gitkeep              |   0
 .../DataSetTemplate/bin/experiment            | Bin 0 -> 18068 bytes
 .../DataSetTemplate/experimentation/main.cpp  |  46 +++++++++++++++
 .../DataSetTemplate/include/BankAccount.h     |  22 ++++++++
 .../DataSetTemplate/include/DataSetTemplate.h |  19 +++++++
 .../DataSetTemplate/include/PointT.h          |  24 ++++++++
 .../DataSetTemplate/src/BankAccount.cpp       |  34 +++++++++++
 .../DataSetTemplate/src/DataSetTemplate.cpp   |  37 ++++++++++++
 .../DataSetTemplate/src/PointT.cpp            |  49 ++++++++++++++++
 10 files changed, 284 insertions(+)
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/Makefile
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/bin/.gitkeep
 create mode 100755 Lectures/L26_SpecViaUML/DataSetTemplate/bin/experiment
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/experimentation/main.cpp
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/include/BankAccount.h
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/include/DataSetTemplate.h
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/include/PointT.h
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/src/BankAccount.cpp
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/src/DataSetTemplate.cpp
 create mode 100644 Lectures/L26_SpecViaUML/DataSetTemplate/src/PointT.cpp

diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/Makefile b/Lectures/L26_SpecViaUML/DataSetTemplate/Makefile
new file mode 100644
index 00000000..d2c5aca0
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/Makefile
@@ -0,0 +1,53 @@
+SRC_DIRS := src
+C_SRCS := $(foreach srcdir,$(SRC_DIRS),$(wildcard $(srcdir)/*.c))
+CXX_SRCS := $(foreach srcdir,$(SRC_DIRS),$(wildcard $(srcdir)/*.cpp))
+C_OBJS := ${C_SRCS:.c=.o}
+CXX_OBJS := ${CXX_SRCS:.cpp=.o}
+OBJS := $(C_OBJS) $(CXX_OBJS)
+INCLUDE_DIRS := include
+LIBRARY_DIRS :=
+LIBRARIES :=
+
+prog_NAME := experiment
+prog_DIR := bin
+prog_FULL := $(prog_DIR)/$(prog_NAME)
+prog_SRC_DIRS := experimentation
+prog_C_SRCS := $(foreach srcdir,$(prog_SRC_DIRS),$(wildcard $(srcdir)/*.c))
+prog_CXX_SRCS := $(foreach srcdir,$(prog_SRC_DIRS),$(wildcard $(srcdir)/*.cpp))
+prog_C_OBJS := ${prog_C_SRCS:.c=.o}
+prog_CXX_OBJS := ${prog_CXX_SRCS:.cpp=.o}
+prog_OBJS := $(prog_C_OBJS) $(prog_CXX_OBJS)
+prog_INCLUDE_DIRS :=
+prog_LIBRARY_DIRS :=
+prog_LIBRARIES :=
+
+all_OBJS := $(OBJS) $(prog_OBJS) $(test_OBJS)
+DEP := $(all_OBJS:%.o=%.d)
+
+CXXFLAGS += -std=c++11
+CXXFLAGS += $(foreach includedir,$(INCLUDE_DIRS),-I$(includedir))
+LDFLAGS += $(foreach librarydir,$(LIBRARY_DIRS),-L$(librarydir))
+LDFLAGS += $(foreach library,$(LIBRARIES),-l$(library))
+
+.PHONY: experiment src clean
+
+experiment: CXXFLAGS += $(foreach includedir,$(prog_INCLUDE_DIRS),-I$(includedir))
+experiment: LDFLAGS += $(foreach librarydir,$(prog_LIBRARY_DIRS),-L$(librarydir))
+experiment: LDFLAGS += $(foreach library,$(prog_LIBRARIES),-l$(library)) 
+
+experiment: $(prog_FULL)
+	./$(prog_FULL)
+  
+$(prog_FULL): $(prog_OBJS) $(OBJS)
+	$(LINK.cc) $^ -o $@
+
+-include $(DEP)
+
+%.o: %.cpp
+	$(CXX) $(CXXFLAGS) -MMD -c $< -o $@
+  
+clean:
+	@- $(RM) $(prog_FULL)
+	@- $(RM) $(prog_OBJS)
+	@- $(RM) $(OBJS)
+	@- $(RM) $(DEP)
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/bin/.gitkeep b/Lectures/L26_SpecViaUML/DataSetTemplate/bin/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/bin/experiment b/Lectures/L26_SpecViaUML/DataSetTemplate/bin/experiment
new file mode 100755
index 0000000000000000000000000000000000000000..1d18dba6b3dd053f4af4df8ba610796138725f12
GIT binary patch
literal 18068
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
G&wm4-&HY;d

literal 0
HcmV?d00001

diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/experimentation/main.cpp b/Lectures/L26_SpecViaUML/DataSetTemplate/experimentation/main.cpp
new file mode 100644
index 00000000..81f42b8a
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/experimentation/main.cpp
@@ -0,0 +1,46 @@
+#include "PointT.h"
+#include "BankAccount.h"
+#include "DataSetTemplate.h"
+
+#include <iostream>
+using namespace std;
+
+typedef DataSetTemplate<PointT> DataSetPointT;
+typedef DataSetTemplate<BankAccount> DataSetBankAccount;
+
+int main()
+{
+
+  //Test Data Set Inteface with PointT
+  PointT p1(0.0, 0.0);
+  PointT p2(3.0, 4.0);
+  PointT p3(7.0, 24.0);
+  PointT p4(5.0, 12.0);
+
+  DataSetPointT ds;
+  ds.add(p1);
+  ds.add(p2);
+  ds.add(p3);
+  ds.add(p4);
+  
+  cout << "average = " << ds.getAverage() << "\n";
+
+  cout << "maximum = " << ds.getMaximum() << "\n";
+
+  //Test Data Set Inteface with Bank Account
+
+  BankAccount b1;
+  b1.deposit(300);
+  BankAccount b2;
+  b2.deposit(100);
+
+  DataSetBankAccount dsBank;
+  dsBank.add(b1);
+  dsBank.add(b2);
+    
+  cout << "average = " << dsBank.getAverage() << "\n";
+
+  cout << "maximum = " << dsBank.getMaximum() << "\n";
+  
+  return 0;
+}
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/include/BankAccount.h b/Lectures/L26_SpecViaUML/DataSetTemplate/include/BankAccount.h
new file mode 100644
index 00000000..3fd94082
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/include/BankAccount.h
@@ -0,0 +1,22 @@
+#ifndef BANKACCOUNT_H
+#define BANKACCOUNT_H
+
+#include <iostream>
+
+class BankAccount
+{
+  public:
+    BankAccount();
+    void deposit(double amount);
+    void withdraw(double amount);
+    double getBalance();
+
+    friend std::ostream& operator<< (std::ostream &out, const BankAccount &ba);
+
+    double getMeasure();
+    
+  private: 
+    double balance;
+};
+
+#endif
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/include/DataSetTemplate.h b/Lectures/L26_SpecViaUML/DataSetTemplate/include/DataSetTemplate.h
new file mode 100644
index 00000000..15f22fea
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/include/DataSetTemplate.h
@@ -0,0 +1,19 @@
+#ifndef DATASETTEMPLATE_H
+#define DATASETTEMPLATE_H
+
+template <class T>
+class DataSetTemplate
+{
+  private:
+    double sum;
+    T maximum;
+    int count;
+
+  public:
+    DataSetTemplate();
+    void add(T x);
+    double getAverage();
+    T getMaximum();
+};
+
+#endif
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/include/PointT.h b/Lectures/L26_SpecViaUML/DataSetTemplate/include/PointT.h
new file mode 100644
index 00000000..65a934b2
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/include/PointT.h
@@ -0,0 +1,24 @@
+#ifndef POINTT_H
+#define POINTT_H
+
+#include <iostream>
+
+class PointT
+{
+  public:
+    PointT();
+    PointT(double x, double y);
+    double xcoord();
+    double ycoord();
+    double distToOrigin();
+
+    friend std::ostream& operator<< (std::ostream &out, const PointT &point);
+
+    double getMeasure();
+    
+  private: 
+    double xc;
+    double yc;
+};
+
+#endif
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/src/BankAccount.cpp b/Lectures/L26_SpecViaUML/DataSetTemplate/src/BankAccount.cpp
new file mode 100644
index 00000000..2abe22d2
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/src/BankAccount.cpp
@@ -0,0 +1,34 @@
+#include "BankAccount.h"
+
+BankAccount::BankAccount()
+{
+  this->balance = 0.0;
+}
+
+void BankAccount::deposit(double amount)
+{
+  this->balance += amount;
+}
+
+void BankAccount::withdraw(double amount)
+{
+  this->balance -= amount;
+}
+
+double BankAccount::getBalance()
+{
+  return balance;
+}
+
+double BankAccount::getMeasure()
+{
+  return balance;
+}
+
+std::ostream& operator<< (std::ostream &out, const BankAccount &ba)
+{
+  //From http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/
+  out << "BankAccount(" << ba.balance << ") ";
+ 
+  return out;
+}
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/src/DataSetTemplate.cpp b/Lectures/L26_SpecViaUML/DataSetTemplate/src/DataSetTemplate.cpp
new file mode 100644
index 00000000..ee1d3bc0
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/src/DataSetTemplate.cpp
@@ -0,0 +1,37 @@
+#include "DataSetTemplate.h"
+
+#include "PointT.h"
+#include "BankAccount.h"
+
+template <class T>
+DataSetTemplate<T>::DataSetTemplate() : maximum()
+{
+  this->sum = 0.0;
+  this->count = 0;
+}
+
+template <class T>
+void DataSetTemplate<T>::add(T x)
+{
+   this->sum += x.getMeasure();
+   if (count == 0 || maximum.getMeasure() < x.getMeasure()) maximum = x;
+   count++;
+}
+
+template <class T>
+double DataSetTemplate<T>::getAverage()
+{
+   if (count == 0) return 0;
+     else return sum/count;
+}
+
+template <class T>
+T DataSetTemplate<T>::getMaximum()
+{
+   return maximum;
+}
+
+// explicit instantiations
+template class DataSetTemplate<PointT>;
+template class DataSetTemplate<BankAccount>;
+
diff --git a/Lectures/L26_SpecViaUML/DataSetTemplate/src/PointT.cpp b/Lectures/L26_SpecViaUML/DataSetTemplate/src/PointT.cpp
new file mode 100644
index 00000000..3a3e5043
--- /dev/null
+++ b/Lectures/L26_SpecViaUML/DataSetTemplate/src/PointT.cpp
@@ -0,0 +1,49 @@
+#include "PointT.h"
+#include <cmath>
+
+PointT::PointT()
+{
+  this->xc = 0.0;
+  this->yc = 0.0;
+}
+
+PointT::PointT(double x, double y)
+{
+  this->xc = x;
+  this->yc = y;
+}
+
+double PointT::xcoord()
+{
+  return this->xc;
+}
+
+double PointT::ycoord()
+{
+  return this->yc;
+}
+
+double PointT::distToOrigin()
+{
+  double dx;
+  double dy;
+
+  dx = this->xc;
+  dy = this->yc;
+
+  return sqrt(pow(dx,2.0) + pow(dy,2.0));
+}
+
+double PointT::getMeasure()
+{
+  return this->distToOrigin();
+}
+
+std::ostream& operator<< (std::ostream &out, const PointT& point)
+{
+  //From http://www.learncpp.com/cpp-tutorial/93-overloading-the-io-operators/
+  // Since operator<< is a friend of the Point class, we can access Point's members directly.
+  out << "PointT(" << point.xc << ", " << point.yc << ")";
+ 
+  return out;
+}
-- 
GitLab