From e44efb5130f1b901e25fd3121aabeafaf456e803 Mon Sep 17 00:00:00 2001
From: andy <a.heather@opencfd.co.uk>
Date: Wed, 20 Oct 2010 11:03:00 +0100
Subject: [PATCH] ENH: Added copy/clone functionality tp DataEntry class

---
 .../IO/DataEntry/Constant/Constant.C          | 22 +++------------
 .../IO/DataEntry/Constant/Constant.H          | 25 ++++++-----------
 .../IO/DataEntry/DataEntry/DataEntry.C        | 27 +++++++++++++++++++
 .../IO/DataEntry/DataEntry/DataEntry.H        | 12 +++++++--
 .../submodels/IO/DataEntry/Table/Table.H      |  6 +++++
 .../IO/DataEntry/polynomial/polynomial.H      | 13 ++++-----
 6 files changed, 62 insertions(+), 43 deletions(-)

diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.C b/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.C
index fca56988570..cca5a8e9506 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.C
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.C
@@ -31,8 +31,10 @@ template<class Type>
 Foam::Constant<Type>::Constant(const word& entryName, Istream& is)
 :
     DataEntry<Type>(entryName),
-    value_(is)
-{}
+    value_(pTraits<Type>::zero)
+{
+    is  >> value_;
+}
 
 
 template<class Type>
@@ -43,22 +45,6 @@ Foam::Constant<Type>::Constant(const Constant<Type>& cnst)
 {}
 
 
-template<>
-Foam::Constant<Foam::label>::Constant(const word& entryName, Istream& is)
-:
-    DataEntry<label>(entryName),
-    value_(readLabel(is))
-{}
-
-
-template<>
-Foam::Constant<Foam::scalar>::Constant(const word& entryName, Istream& is)
-:
-    DataEntry<scalar>(entryName),
-    value_(readScalar(is))
-{}
-
-
 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
 
 template<class Type>
diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.H b/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.H
index 3a36935c111..ef15f0f0c57 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.H
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/Constant/Constant.H
@@ -51,11 +51,7 @@ template<class Type>
 class Constant;
 
 template<class Type>
-Ostream& operator<<
-(
-    Ostream&,
-    const Constant<Type>&
-);
+Ostream& operator<<(Ostream&, const Constant<Type>&);
 
 /*---------------------------------------------------------------------------*\
                            Class Constant Declaration
@@ -92,6 +88,12 @@ public:
         //- Copy constructor
         Constant(const Constant<Type>& cnst);
 
+        //- Construct and return a clone
+        virtual tmp<DataEntry<Type> > clone() const
+        {
+            return tmp<DataEntry<Type> >(new Constant<Type>(*this));
+        }
+
 
     //- Destructor
     virtual ~Constant();
@@ -107,23 +109,12 @@ public:
 
 
     //- Ostream Operator
-    friend Ostream& operator<< <Type>
-    (
-        Ostream&,
-        const Constant<Type>&
-    );
+    friend Ostream& operator<< <Type>(Ostream&, const Constant<Type>&);
 };
 
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-template<>
-Constant<label>::Constant(const word& entryName, Istream& is);
-
-template<>
-Constant<scalar>::Constant(const word& entryName, Istream& is);
-
-
 } // End namespace Foam
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.C b/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.C
index cd9f3a4b0c7..2ebcd67bd34 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.C
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.C
@@ -30,6 +30,7 @@ License
 template<class Type>
 Foam::DataEntry<Type>::DataEntry(const word& entryName)
 :
+    refCount(),
     name_(entryName)
 {}
 
@@ -37,6 +38,7 @@ Foam::DataEntry<Type>::DataEntry(const word& entryName)
 template<class Type>
 Foam::DataEntry<Type>::DataEntry(const DataEntry<Type>& de)
 :
+    refCount(),
     name_(de.name_)
 {}
 
@@ -57,6 +59,31 @@ const Foam::word& Foam::DataEntry<Type>::name() const
 }
 
 
+template<class Type>
+Type Foam::DataEntry<Type>::value(const scalar x) const
+{
+    notImplemented("Type Foam::DataEntry<Type>::value(const scalar) const");
+
+    return pTraits<Type>::zero;
+}
+
+
+template<class Type>
+Type Foam::DataEntry<Type>::integrate(const scalar x1, const scalar x2) const
+{
+    notImplemented
+    (
+        "Type Foam::DataEntry<Type>::integrate"
+        "("
+            "const scalar, "
+            "const scalar"
+        ") const"
+    );
+
+    return pTraits<Type>::zero;
+}
+
+
 // * * * * * * * * * * * * * *  IOStream operators * * * * * * * * * * * * * //
 
 #include "DataEntryIO.C"
diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.H b/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.H
index c2048c25d30..03c1b7b417d 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.H
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/DataEntry/DataEntry.H
@@ -62,6 +62,8 @@ Ostream& operator<<
 
 template<class Type>
 class DataEntry
+:
+    public refCount
 {
     // Private Member Functions
 
@@ -104,6 +106,12 @@ public:
         //- Copy constructor
         DataEntry(const DataEntry<Type>& de);
 
+        //- Construct and return a clone
+        virtual tmp<DataEntry<Type> > clone() const
+        {
+            return tmp<DataEntry<Type> >(new DataEntry<Type>(*this));
+        }
+
 
     //- Selector
     static autoPtr<DataEntry<Type> > New
@@ -128,10 +136,10 @@ public:
         // Evaluation
 
             //- Return value as a function of (scalar) independent variable
-            virtual Type value(const scalar x) const = 0;
+            virtual Type value(const scalar x) const;
 
             //- Integrate between two (scalar) values
-            virtual Type integrate(const scalar x1, const scalar x2) const = 0;
+            virtual Type integrate(const scalar x1, const scalar x2) const;
 
 
     //- Ostream Operator
diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/Table/Table.H b/src/lagrangian/intermediate/submodels/IO/DataEntry/Table/Table.H
index bdb84e87eec..61a3596fd71 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/Table/Table.H
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/Table/Table.H
@@ -98,6 +98,12 @@ public:
         //- Copy constructor
         Table(const Table<Type>& tbl);
 
+        //- Construct and return a clone
+        virtual tmp<DataEntry<Type> > clone() const
+        {
+            return tmp<DataEntry<Type> >(new Table<Type>(*this));
+        }
+
 
     //- Destructor
     virtual ~Table();
diff --git a/src/lagrangian/intermediate/submodels/IO/DataEntry/polynomial/polynomial.H b/src/lagrangian/intermediate/submodels/IO/DataEntry/polynomial/polynomial.H
index 47fc1fd30fa..78c55c78704 100644
--- a/src/lagrangian/intermediate/submodels/IO/DataEntry/polynomial/polynomial.H
+++ b/src/lagrangian/intermediate/submodels/IO/DataEntry/polynomial/polynomial.H
@@ -91,12 +91,17 @@ public:
 
     // Constructors
 
-        //- Construct from entry name and Istream
         polynomial(const word& entryName, Istream& is);
 
         //- Copy constructor
         polynomial(const polynomial& poly);
 
+        //- Construct and return a clone
+        virtual tmp<DataEntry<scalar> > clone() const
+        {
+            return tmp<DataEntry<scalar> >(new polynomial(*this));
+        }
+
 
     //- Destructor
     virtual ~polynomial();
@@ -112,11 +117,7 @@ public:
 
 
     //- Ostream Operator
-    friend Ostream& operator<<
-    (
-        Ostream&,
-        const polynomial&
-    );
+    friend Ostream& operator<<(Ostream&, const polynomial&);
 };
 
 
-- 
GitLab