From de04ab8c02ef018c315fb36d921a2b5f4c93fdf3 Mon Sep 17 00:00:00 2001
From: Chuck Atkins <chuck.atkins@kitware.com>
Date: Thu, 13 Apr 2017 15:59:07 -0400
Subject: [PATCH] Isolate .tcc for BPWriter out of the public interface

---
 include/utilities/format/bp1/BP1.h            |  3 +-
 include/utilities/format/bp1/BP1Writer.h      | 73 +++++++------------
 source/CMakeLists.txt                         |  1 +
 source/utilities/format/bp1/BP1Writer.cpp     | 36 ++++++++-
 .../utilities/format/bp1/BP1Writer.tcc        |  6 +-
 5 files changed, 67 insertions(+), 52 deletions(-)
 rename {include => source}/utilities/format/bp1/BP1Writer.tcc (99%)

diff --git a/include/utilities/format/bp1/BP1.h b/include/utilities/format/bp1/BP1.h
index 361fa1887..d1b394088 100644
--- a/include/utilities/format/bp1/BP1.h
+++ b/include/utilities/format/bp1/BP1.h
@@ -13,7 +13,6 @@
 
 #include "utilities/format/bp1/BP1Aggregator.h"
 #include "utilities/format/bp1/BP1Structs.h"
-//#include "utilities/format/bp1/BP1Writer.h"
-#include "utilities/format/bp1/BP1Writer.tcc"
+#include "utilities/format/bp1/BP1Writer.h"
 
 #endif /* BP1_H_ */
diff --git a/include/utilities/format/bp1/BP1Writer.h b/include/utilities/format/bp1/BP1Writer.h
index 0fca73c4a..a551114ad 100644
--- a/include/utilities/format/bp1/BP1Writer.h
+++ b/include/utilities/format/bp1/BP1Writer.h
@@ -279,55 +279,34 @@ private:
                          capsule::STLVector &buffer) const noexcept;
 };
 
-//#define declare_template_instantiation(T)                                      \
-//    extern template std::size_t BP1Writer::GetVariableIndexSize(               \
-//        const Variable<T> &variable) const noexcept;                           \
-//                                                                               \
-//    extern template void BP1Writer::WriteVariablePayload(                      \
-//        const Variable<T> &variable, capsule::STLVector &heap,                 \
-//        const unsigned int nthreads) const noexcept;                           \
-//                                                                               \
-//    extern template void BP1Writer::WriteBoundsRecord(                         \
-//        const bool isScalar, const Stats<T> &stats, std::vector<char> &buffer, \
-//        std::uint8_t &characteristicsCounter, const bool addLength)            \
-//        const noexcept;                                                        \
-//                                                                               \
-//    extern template void BP1Writer::WriteCharacteristicRecord(                 \
-//        const std::uint8_t characteristicID, const T &value,                   \
-//        std::vector<char> &buffer, std::uint8_t &characteristicsCounter,       \
-//        const bool addLength) const noexcept;
-//
-// ADIOS_FOREACH_TYPE_1ARG(declare_template_instantiation)
-//#undef declare_template_instantiation
-//
-//// SEPARATE PRIMITIVE FROM COMPLEX OVERLOADS
-//// PRIMITIVE
-//#define declare_template_instantiation(T)                                      \
-//    extern template void BP1Writer::WriteVariableMetadata(                     \
-//        const Variable<T> &variable, capsule::STLVector &heap,                 \
-//        BP1MetadataSet &metadataSet) const noexcept;                           \
-//                                                                               \
-//    extern template BP1Writer::Stats<T> BP1Writer::GetStats(                   \
-//        const Variable<T> &variable) const noexcept;
-//
-// ADIOS_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation)
-//#undef declare_template_instantiation
-//
-//// COMPLEX
-//#define declare_template_instantiation(T)                                      \
-//    extern template void BP1Writer::WriteVariableMetadata(                     \
-//        const Variable<std::complex<T>> &variable, capsule::STLVector &heap,   \
-//        BP1MetadataSet &metadataSet) const noexcept;                           \
-//                                                                               \
-//    extern template BP1Writer::Stats<T> BP1Writer::GetStats(                   \
-//        const Variable<std::complex<T>> &variable) const noexcept;
-//
-// ADIOS_FOREACH_COMPLEX_TYPE_1ARG(declare_template_instantiation)
-//#undef declare_template_instantiation
+#define declare_template_instantiation(T)                                      \
+    extern template void BP1Writer::WriteVariablePayload(                      \
+        const Variable<T> &variable, capsule::STLVector &heap,                 \
+        const unsigned int nthreads) const noexcept;
+
+ADIOS_FOREACH_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
+
+// SEPARATE PRIMITIVE FROM COMPLEX OVERLOADS
+// PRIMITIVE
+#define declare_template_instantiation(T)                                      \
+    extern template void BP1Writer::WriteVariableMetadata(                     \
+        const Variable<T> &variable, capsule::STLVector &heap,                 \
+        BP1MetadataSet &metadataSet) const noexcept;
+
+ADIOS_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
+
+// COMPLEX
+#define declare_template_instantiation(T)                                      \
+    extern template void BP1Writer::WriteVariableMetadata(                     \
+        const Variable<std::complex<T>> &variable, capsule::STLVector &heap,   \
+        BP1MetadataSet &metadataSet) const noexcept;
+
+ADIOS_FOREACH_COMPLEX_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
 
 } // end namespace format
 } // end namespace adios
 
-//#include "utilities/format/bp1/BP1Writer.tcc"
-
 #endif /* BP1WRITER_H_ */
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
index 2ccf94700..7ce7dfeb1 100644
--- a/source/CMakeLists.txt
+++ b/source/CMakeLists.txt
@@ -35,6 +35,7 @@ foreach(adios2_target IN LISTS adios2_targets)
     utilities/format/bp1/BP1Base.cpp
     utilities/format/bp1/BP1Aggregator.cpp
     utilities/format/bp1/BP1Writer.cpp
+    utilities/format/bp1/BP1Writer.tcc
     
     utilities/profiling/iochrono/Timer.cpp
   )
diff --git a/source/utilities/format/bp1/BP1Writer.cpp b/source/utilities/format/bp1/BP1Writer.cpp
index a586274ec..1233cf275 100644
--- a/source/utilities/format/bp1/BP1Writer.cpp
+++ b/source/utilities/format/bp1/BP1Writer.cpp
@@ -13,8 +13,8 @@
 #include <vector>
 /// \endcond
 
-//#include "utilities/format/bp1/BP1Writer.h"
-#include "utilities/format/bp1/BP1Writer.tcc"
+#include "BP1Writer.tcc"
+#include "utilities/format/bp1/BP1Writer.h"
 
 namespace adios
 {
@@ -418,5 +418,37 @@ void BP1Writer::FlattenMetadata(BP1MetadataSet &metadataSet,
         metadataSet.Log.TotalBytes.push_back(heap.m_DataAbsolutePosition);
 }
 
+//------------------------------------------------------------------------------
+// Explicit instantiaiton of public tempaltes
+
+#define declare_template_instantiation(T)                                      \
+    template void BP1Writer::WriteVariablePayload(                             \
+        const Variable<T> &variable, capsule::STLVector &heap,                 \
+        const unsigned int nthreads) const noexcept;
+
+ADIOS_FOREACH_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
+
+// SEPARATE PRIMITIVE FROM COMPLEX OVERLOADS
+// PRIMITIVE
+#define declare_template_instantiation(T)                                      \
+    template void BP1Writer::WriteVariableMetadata(                            \
+        const Variable<T> &variable, capsule::STLVector &heap,                 \
+        BP1MetadataSet &metadataSet) const noexcept;
+
+ADIOS_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
+
+// COMPLEX
+#define declare_template_instantiation(T)                                      \
+    template void BP1Writer::WriteVariableMetadata(                            \
+        const Variable<std::complex<T>> &variable, capsule::STLVector &heap,   \
+        BP1MetadataSet &metadataSet) const noexcept;
+
+ADIOS_FOREACH_COMPLEX_TYPE_1ARG(declare_template_instantiation)
+#undef declare_template_instantiation
+
+//------------------------------------------------------------------------------
+
 } // end namespace format
 } // end namespace adios
diff --git a/include/utilities/format/bp1/BP1Writer.tcc b/source/utilities/format/bp1/BP1Writer.tcc
similarity index 99%
rename from include/utilities/format/bp1/BP1Writer.tcc
rename to source/utilities/format/bp1/BP1Writer.tcc
index 73a30f6e6..a554b0314 100644
--- a/include/utilities/format/bp1/BP1Writer.tcc
+++ b/source/utilities/format/bp1/BP1Writer.tcc
@@ -7,6 +7,8 @@
  *  Created on: Apr 11, 2017
  *      Author: wfg
  */
+#ifndef BP1WRITER_TCC_
+#define BP1WRITER_TCC_
 
 #include "utilities/format/bp1/BP1Writer.h"
 
@@ -343,4 +345,6 @@ void BP1Writer::WriteVariableCharacteristics(const Variable<T> &variable,
 }
 
 } // end namespace format
-} // end namespace
+} // end namespace adios
+
+#endif // BP1WRITER_TCC_
-- 
GitLab