Skip to content

Commit 91f6585

Browse files
wjones127pitrou
authored andcommitted
ARROW-15952: [C++] Document Visitors and finish Scalar::Accept
Closes apache#12651 from wjones127/ARROW-15952-document-visitor Authored-by: Will Jones <willjones127@gmail.com> Signed-off-by: Antoine Pitrou <antoine@python.org>
1 parent 5c3807b commit 91f6585

10 files changed

Lines changed: 69 additions & 0 deletions

File tree

cpp/src/arrow/array/array_base.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ class ARROW_EXPORT Array {
133133
int64_t end_idx, int64_t other_start_idx,
134134
const EqualOptions& = EqualOptions::Defaults()) const;
135135

136+
/// \brief Apply the ArrayVisitor::Visit() method specialized to the array type
136137
Status Accept(ArrayVisitor* visitor) const;
137138

138139
/// Construct a zero-copy view of this array with the given type.

cpp/src/arrow/scalar.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ bool Scalar::ApproxEquals(const Scalar& other, const EqualOptions& options) cons
5252
return ScalarApproxEquals(*this, other, options);
5353
}
5454

55+
Status Scalar::Accept(ScalarVisitor* visitor) const {
56+
return VisitScalarInline(*this, visitor);
57+
}
58+
5559
namespace {
5660

5761
// Implementation of Scalar::hash()

cpp/src/arrow/scalar.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ struct ARROW_EXPORT Scalar : public util::EqualityComparable<Scalar> {
103103

104104
ARROW_EXPORT friend void PrintTo(const Scalar& scalar, std::ostream* os);
105105

106+
/// \brief Apply the ScalarVisitor::Visit() method specialized to the scalar type
107+
Status Accept(ScalarVisitor* visitor) const;
108+
106109
protected:
107110
Scalar(std::shared_ptr<DataType> type, bool is_valid)
108111
: type(std::move(type)), is_valid(is_valid) {}

cpp/src/arrow/type.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ class ARROW_EXPORT DataType : public detail::Fingerprintable {
149149
/// \brief Return the number of children fields associated with this type.
150150
int num_fields() const { return static_cast<int>(children_.size()); }
151151

152+
/// \brief Apply the TypeVisitor::Visit() method specialized to the data type
152153
Status Accept(TypeVisitor* visitor) const;
153154

154155
/// \brief A string representation of the type, including any children

cpp/src/arrow/visitor.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,9 @@ SCALAR_VISITOR_DEFAULT(MapScalar)
166166
SCALAR_VISITOR_DEFAULT(FixedSizeListScalar)
167167
SCALAR_VISITOR_DEFAULT(StructScalar)
168168
SCALAR_VISITOR_DEFAULT(DictionaryScalar)
169+
SCALAR_VISITOR_DEFAULT(SparseUnionScalar)
170+
SCALAR_VISITOR_DEFAULT(DenseUnionScalar)
171+
SCALAR_VISITOR_DEFAULT(ExtensionScalar)
169172

170173
#undef SCALAR_VISITOR_DEFAULT
171174

cpp/src/arrow/visitor.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323

2424
namespace arrow {
2525

26+
/// \brief Abstract array visitor class
27+
///
28+
/// Subclass this to create a visitor that can be used with the Array::Accept()
29+
/// method.
2630
class ARROW_EXPORT ArrayVisitor {
2731
public:
2832
virtual ~ArrayVisitor() = default;
@@ -67,6 +71,10 @@ class ARROW_EXPORT ArrayVisitor {
6771
virtual Status Visit(const ExtensionArray& array);
6872
};
6973

74+
/// \brief Abstract type visitor class
75+
///
76+
/// Subclass this to create a visitor that can be used with the DataType::Accept()
77+
/// method.
7078
class ARROW_EXPORT TypeVisitor {
7179
public:
7280
virtual ~TypeVisitor() = default;
@@ -111,6 +119,10 @@ class ARROW_EXPORT TypeVisitor {
111119
virtual Status Visit(const ExtensionType& type);
112120
};
113121

122+
/// \brief Abstract scalar visitor class
123+
///
124+
/// Subclass this to create a visitor that can be used with the Scalar::Accept()
125+
/// method.
114126
class ARROW_EXPORT ScalarVisitor {
115127
public:
116128
virtual ~ScalarVisitor() = default;
@@ -150,6 +162,9 @@ class ARROW_EXPORT ScalarVisitor {
150162
virtual Status Visit(const FixedSizeListScalar& scalar);
151163
virtual Status Visit(const StructScalar& scalar);
152164
virtual Status Visit(const DictionaryScalar& scalar);
165+
virtual Status Visit(const SparseUnionScalar& scalar);
166+
virtual Status Visit(const DenseUnionScalar& scalar);
167+
virtual Status Visit(const ExtensionScalar& scalar);
153168
};
154169

155170
} // namespace arrow

docs/source/cpp/api/array.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,12 @@ Chunked Arrays
7878
.. doxygenclass:: arrow::ChunkedArray
7979
:project: arrow_cpp
8080
:members:
81+
82+
83+
Utilities
84+
=========
85+
86+
.. doxygenclass:: arrow::ArrayVisitor
87+
:project: arrow_cpp
88+
:members:
89+
:undoc-members:

docs/source/cpp/api/datatype.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,12 @@ Helpers for looking up fields
109109

110110
.. doxygenclass:: arrow::FieldRef
111111
:members:
112+
113+
114+
Utilities
115+
=========
116+
117+
.. doxygenclass:: arrow::TypeVisitor
118+
:project: arrow_cpp
119+
:members:
120+
:undoc-members:

docs/source/cpp/api/scalar.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,12 @@ Concrete scalar subclasses
3636
:content-only:
3737
:members:
3838
:undoc-members:
39+
40+
41+
Utilities
42+
=========
43+
44+
.. doxygenclass:: arrow::ScalarVisitor
45+
:project: arrow_cpp
46+
:members:
47+
:undoc-members:

docs/source/cpp/conventions.rst

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,3 +105,18 @@ For example::
105105

106106
.. seealso::
107107
:doc:`API reference for error reporting <api/support>`
108+
109+
Visitor Pattern
110+
---------------
111+
112+
Several types, including :class:`arrow::DataType`, :class:`arrow::Scalar`, and
113+
:class:`arrow::Array`, have sub-types specialized to their corresponding Arrow
114+
types. For example, for the Arrow boolean type there is :class:`arrow::BooleanType`,
115+
:class:`arrow::BooleanScalar`, and :class:`arrow::BooleanArray`. In order to
116+
process these entities, you may need to write write logic that specializes based
117+
on the particular Arrow type. In these cases, use the
118+
`visitor pattern <https://en.wikipedia.org/wiki/Visitor_pattern>`_.
119+
120+
Arrow provides abstract visitor classes (:class:`arrow::TypeVisitor`,
121+
:class:`arrow::ScalarVisitor`, :class:`arrow::ArrayVisitor`) and an ``Accept()``
122+
method on each of the corresponding base types (e.g. :func:`arrow::Array::Accept`).

0 commit comments

Comments
 (0)