Repository: arrow
Updated Branches:
  refs/heads/master 8f386374e -> f7b287a28


ARROW-627: [C++] Add compatibility macros for exported extern templates

This should also reduce compiler warnings on MSVC

Author: Wes McKinney <wes.mckin...@twosigma.com>

Closes #447 from wesm/ARROW-627 and squashes the following commits:

3f6277d [Wes McKinney] Wrong define for msvc
b53a400 [Wes McKinney] MSVC needs export annotation when instantiating templates
8a9fcb4 [Wes McKinney] Add compatibility macros for exported extern templates, 
also to reduce compiler warnings in MSVC


Project: http://git-wip-us.apache.org/repos/asf/arrow/repo
Commit: http://git-wip-us.apache.org/repos/asf/arrow/commit/f7b287a2
Tree: http://git-wip-us.apache.org/repos/asf/arrow/tree/f7b287a2
Diff: http://git-wip-us.apache.org/repos/asf/arrow/diff/f7b287a2

Branch: refs/heads/master
Commit: f7b287a28d62c6b246665da7eee50fe222ebaaeb
Parents: 8f38637
Author: Wes McKinney <wes.mckin...@twosigma.com>
Authored: Wed Mar 29 19:53:08 2017 -0400
Committer: Wes McKinney <wes.mckin...@twosigma.com>
Committed: Wed Mar 29 19:53:08 2017 -0400

----------------------------------------------------------------------
 cpp/src/arrow/array.cc          | 32 +++++++++++++--------------
 cpp/src/arrow/array.h           | 43 ++++++++++++++----------------------
 cpp/src/arrow/tensor.cc         | 22 +++++++++---------
 cpp/src/arrow/tensor.h          | 33 +++++++++------------------
 cpp/src/arrow/type.h            |  4 ++--
 cpp/src/arrow/util/visibility.h | 17 ++++++++++++++
 6 files changed, 73 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/array.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array.cc b/cpp/src/arrow/array.cc
index 3ea0333..b25411a 100644
--- a/cpp/src/arrow/array.cc
+++ b/cpp/src/arrow/array.cc
@@ -445,21 +445,21 @@ Status Array::Accept(ArrayVisitor* visitor) const {
 // ----------------------------------------------------------------------
 // Instantiate templates
 
-template class NumericArray<UInt8Type>;
-template class NumericArray<UInt16Type>;
-template class NumericArray<UInt32Type>;
-template class NumericArray<UInt64Type>;
-template class NumericArray<Int8Type>;
-template class NumericArray<Int16Type>;
-template class NumericArray<Int32Type>;
-template class NumericArray<Int64Type>;
-template class NumericArray<TimestampType>;
-template class NumericArray<Date32Type>;
-template class NumericArray<Date64Type>;
-template class NumericArray<Time32Type>;
-template class NumericArray<Time64Type>;
-template class NumericArray<HalfFloatType>;
-template class NumericArray<FloatType>;
-template class NumericArray<DoubleType>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<UInt8Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<UInt16Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<UInt32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<UInt64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Int8Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Int16Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Int32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Int64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<TimestampType>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Date32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Date64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Time32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<Time64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<HalfFloatType>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<FloatType>;
+template class ARROW_TEMPLATE_EXPORT NumericArray<DoubleType>;
 
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/array.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/array.h b/cpp/src/arrow/array.h
index c0ec571..53b6408 100644
--- a/cpp/src/arrow/array.h
+++ b/cpp/src/arrow/array.h
@@ -483,34 +483,23 @@ class ARROW_EXPORT DictionaryArray : public Array {
 // ----------------------------------------------------------------------
 // extern templates and other details
 
-// gcc and clang disagree about how to handle template visibility when you have
-// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wattributes"
-#endif
-
 // Only instantiate these templates once
-extern template class ARROW_EXPORT NumericArray<Int8Type>;
-extern template class ARROW_EXPORT NumericArray<UInt8Type>;
-extern template class ARROW_EXPORT NumericArray<Int16Type>;
-extern template class ARROW_EXPORT NumericArray<UInt16Type>;
-extern template class ARROW_EXPORT NumericArray<Int32Type>;
-extern template class ARROW_EXPORT NumericArray<UInt32Type>;
-extern template class ARROW_EXPORT NumericArray<Int64Type>;
-extern template class ARROW_EXPORT NumericArray<UInt64Type>;
-extern template class ARROW_EXPORT NumericArray<HalfFloatType>;
-extern template class ARROW_EXPORT NumericArray<FloatType>;
-extern template class ARROW_EXPORT NumericArray<DoubleType>;
-extern template class ARROW_EXPORT NumericArray<Date32Type>;
-extern template class ARROW_EXPORT NumericArray<Date64Type>;
-extern template class ARROW_EXPORT NumericArray<Time32Type>;
-extern template class ARROW_EXPORT NumericArray<Time64Type>;
-extern template class ARROW_EXPORT NumericArray<TimestampType>;
-
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
+ARROW_EXTERN_TEMPLATE NumericArray<Int8Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<UInt8Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Int16Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<UInt16Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Int32Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<UInt32Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Int64Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<UInt64Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<HalfFloatType>;
+ARROW_EXTERN_TEMPLATE NumericArray<FloatType>;
+ARROW_EXTERN_TEMPLATE NumericArray<DoubleType>;
+ARROW_EXTERN_TEMPLATE NumericArray<Date32Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Date64Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Time32Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<Time64Type>;
+ARROW_EXTERN_TEMPLATE NumericArray<TimestampType>;
 
 }  // namespace arrow
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/tensor.cc
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/tensor.cc b/cpp/src/arrow/tensor.cc
index 6489cd0..7c4593f 100644
--- a/cpp/src/arrow/tensor.cc
+++ b/cpp/src/arrow/tensor.cc
@@ -100,16 +100,16 @@ NumericTensor<T>::NumericTensor(const 
std::shared_ptr<Buffer>& data,
     const std::vector<int64_t>& shape, const std::vector<int64_t>& strides)
     : NumericTensor(data, shape, strides, {}) {}
 
-template class NumericTensor<Int8Type>;
-template class NumericTensor<UInt8Type>;
-template class NumericTensor<Int16Type>;
-template class NumericTensor<UInt16Type>;
-template class NumericTensor<Int32Type>;
-template class NumericTensor<UInt32Type>;
-template class NumericTensor<Int64Type>;
-template class NumericTensor<UInt64Type>;
-template class NumericTensor<HalfFloatType>;
-template class NumericTensor<FloatType>;
-template class NumericTensor<DoubleType>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<Int8Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<UInt8Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<Int16Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<UInt16Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<Int32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<UInt32Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<Int64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<UInt64Type>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<HalfFloatType>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<FloatType>;
+template class ARROW_TEMPLATE_EXPORT NumericTensor<DoubleType>;
 
 }  // namespace arrow

http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/tensor.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/tensor.h b/cpp/src/arrow/tensor.h
index 0059368..7bee867 100644
--- a/cpp/src/arrow/tensor.h
+++ b/cpp/src/arrow/tensor.h
@@ -129,29 +129,18 @@ class ARROW_EXPORT NumericTensor : public Tensor {
 // ----------------------------------------------------------------------
 // extern templates and other details
 
-// gcc and clang disagree about how to handle template visibility when you have
-// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wattributes"
-#endif
-
 // Only instantiate these templates once
-extern template class ARROW_EXPORT NumericTensor<Int8Type>;
-extern template class ARROW_EXPORT NumericTensor<UInt8Type>;
-extern template class ARROW_EXPORT NumericTensor<Int16Type>;
-extern template class ARROW_EXPORT NumericTensor<UInt16Type>;
-extern template class ARROW_EXPORT NumericTensor<Int32Type>;
-extern template class ARROW_EXPORT NumericTensor<UInt32Type>;
-extern template class ARROW_EXPORT NumericTensor<Int64Type>;
-extern template class ARROW_EXPORT NumericTensor<UInt64Type>;
-extern template class ARROW_EXPORT NumericTensor<HalfFloatType>;
-extern template class ARROW_EXPORT NumericTensor<FloatType>;
-extern template class ARROW_EXPORT NumericTensor<DoubleType>;
-
-#if defined(__GNUC__) && !defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
+ARROW_EXTERN_TEMPLATE NumericTensor<Int8Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<UInt8Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<Int16Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<UInt16Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<Int32Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<UInt32Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<Int64Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<UInt64Type>;
+ARROW_EXTERN_TEMPLATE NumericTensor<HalfFloatType>;
+ARROW_EXTERN_TEMPLATE NumericTensor<FloatType>;
+ARROW_EXTERN_TEMPLATE NumericTensor<DoubleType>;
 
 }  // namespace arrow
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/type.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/type.h b/cpp/src/arrow/type.h
index dc50ecd..2a73f6b 100644
--- a/cpp/src/arrow/type.h
+++ b/cpp/src/arrow/type.h
@@ -439,7 +439,7 @@ struct ARROW_EXPORT UnionType : public NestedType {
 
 enum class DateUnit : char { DAY = 0, MILLI = 1 };
 
-struct DateType : public FixedWidthType {
+struct ARROW_EXPORT DateType : public FixedWidthType {
  public:
   DateUnit unit;
 
@@ -496,7 +496,7 @@ static inline std::ostream& operator<<(std::ostream& os, 
TimeUnit unit) {
   return os;
 }
 
-struct TimeType : public FixedWidthType {
+struct ARROW_EXPORT TimeType : public FixedWidthType {
  public:
   TimeUnit unit;
 

http://git-wip-us.apache.org/repos/asf/arrow/blob/f7b287a2/cpp/src/arrow/util/visibility.h
----------------------------------------------------------------------
diff --git a/cpp/src/arrow/util/visibility.h b/cpp/src/arrow/util/visibility.h
index 4819a00..6382f7f 100644
--- a/cpp/src/arrow/util/visibility.h
+++ b/cpp/src/arrow/util/visibility.h
@@ -35,4 +35,21 @@
 #endif
 #endif  // Non-Windows
 
+// gcc and clang disagree about how to handle template visibility when you have
+// explicit specializations https://llvm.org/bugs/show_bug.cgi?id=24815
+
+#if defined(__clang__)
+  #define ARROW_EXTERN_TEMPLATE extern template class ARROW_EXPORT
+#else
+  #define ARROW_EXTERN_TEMPLATE extern template class
+#endif
+
+// This is a complicated topic, some reading on it:
+// 
http://www.codesynthesis.com/~boris/blog/2010/01/18/dll-export-cxx-templates/
+#if defined(_MSC_VER)
+  #define ARROW_TEMPLATE_EXPORT ARROW_EXPORT
+#else
+  #define ARROW_TEMPLATE_EXPORT
+#endif
+
 #endif  // ARROW_UTIL_VISIBILITY_H

Reply via email to