Skip to content

Commit 7e76f18

Browse files
committed
EXP: [C++] Require C++20
1 parent 5e9fce4 commit 7e76f18

File tree

43 files changed

+355
-284
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+355
-284
lines changed

.github/workflows/cpp.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ jobs:
278278
include:
279279
- os: windows-2022
280280
simd-level: AVX2
281-
title: AMD64 Windows 2022 AVX2
281+
title: AMD64 Windows 2022 C++20 AVX2
282282
env:
283283
ARROW_BOOST_USE_SHARED: OFF
284284
ARROW_BUILD_BENCHMARKS: ON
@@ -305,7 +305,7 @@ jobs:
305305
ARROW_WITH_ZLIB: ON
306306
ARROW_WITH_ZSTD: ON
307307
BOOST_SOURCE: BUNDLED
308-
CMAKE_CXX_STANDARD: "17"
308+
CMAKE_CXX_STANDARD: "20"
309309
CMAKE_GENERATOR: Ninja
310310
CMAKE_INSTALL_LIBDIR: bin
311311
CMAKE_INSTALL_PREFIX: /usr

.github/workflows/r.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,13 @@ jobs:
288288
# static library. The R is not used here but R 4.1 was the last R to use
289289
# Rtools40.
290290
r-version: "4.1"
291-
rtools-version: 40
291+
rtools-version: ${{ matrix.config.rtools }}
292292
Ncpus: 2
293293
- name: Build Arrow C++
294294
shell: bash
295295
env:
296296
MINGW_ARCH: ${{ matrix.config.arch }}
297+
RTOOLS_VERSION: ${{ matrix.config.rtools }}
297298
run: ci/scripts/r_windows_build.sh
298299
- name: Rename libarrow.zip
299300
# So that they're unique when multiple are downloaded in the next step

.github/workflows/ruby.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ jobs:
353353
ARROW_WITH_SNAPPY: ON
354354
ARROW_WITH_ZLIB: ON
355355
ARROW_WITH_ZSTD: ON
356-
CMAKE_CXX_STANDARD: "17"
356+
CMAKE_CXX_STANDARD: "20"
357357
CMAKE_GENERATOR: Ninja
358358
CMAKE_INSTALL_PREFIX: "${{ github.workspace }}/dist"
359359
CMAKE_UNITY_BUILD: ON

c_glib/meson.build

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ project(
2121
'arrow-glib',
2222
'c',
2323
'cpp',
24-
default_options: ['c_std=c99', 'cpp_std=c++17'],
24+
default_options: ['c_std=c99', 'cpp_std=c++20'],
2525
license: 'Apache-2.0',
2626
# Debian:
2727
# https://packages.debian.org/search?keywords=meson

ci/appveyor-cpp-build.bat

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ cmake -G "%GENERATOR%" %ARROW_CMAKE_ARGS% ^
9393
-DARROW_WITH_ZSTD=ON ^
9494
-DCMAKE_BUILD_TYPE="Release" ^
9595
-DCMAKE_CXX_FLAGS_RELEASE="/MD /Od /UNDEBUG" ^
96-
-DCMAKE_CXX_STANDARD=17 ^
96+
-DCMAKE_CXX_STANDARD=20 ^
9797
-DCMAKE_INSTALL_PREFIX=%CONDA_PREFIX%\Library ^
9898
-DCMAKE_UNITY_BUILD=ON ^
9999
-DCMAKE_VERBOSE_MAKEFILE=OFF ^

ci/docker/centos-7-cpp.dockerfile

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ RUN sed -i \
2525
-e 's/mirror\.centos\.org/vault.centos.org/' \
2626
/etc/yum.repos.d/*.repo
2727

28-
# devtoolset is required for C++17
28+
# devtoolset is required for C++20
2929
RUN \
3030
yum install -y \
3131
centos-release-scl \
@@ -38,7 +38,8 @@ RUN \
3838
/etc/yum.repos.d/CentOS-SCLo-scl*.repo && \
3939
yum install -y \
4040
curl \
41-
devtoolset-8 \
41+
devtoolset-11-gcc-c++ \
42+
devtoolset-11-make \
4243
diffutils \
4344
gcc-c++ \
4445
libcurl-devel \

ci/scripts/cpp_build.sh

+2-2
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ elif [ "${ARROW_EMSCRIPTEN:-OFF}" = "ON" ]; then
140140
-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE_MAKEFILE:-OFF} \
141141
-DCMAKE_C_FLAGS="${CFLAGS:-}" \
142142
-DCMAKE_CXX_FLAGS="${CXXFLAGS:-}" \
143-
-DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-17}" \
143+
-DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-20}" \
144144
-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR:-lib} \
145145
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}} \
146146
-DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD:-OFF} \
@@ -229,7 +229,7 @@ else
229229
-DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE_MAKEFILE:-OFF} \
230230
-DCMAKE_C_FLAGS="${CFLAGS:-}" \
231231
-DCMAKE_CXX_FLAGS="${CXXFLAGS:-}" \
232-
-DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-17}" \
232+
-DCMAKE_CXX_STANDARD="${CMAKE_CXX_STANDARD:-20}" \
233233
-DCMAKE_INSTALL_LIBDIR=${CMAKE_INSTALL_LIBDIR:-lib} \
234234
-DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX:-${ARROW_HOME}} \
235235
-DCMAKE_UNITY_BUILD=${CMAKE_UNITY_BUILD:-OFF} \

ci/scripts/r_windows_build.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ mv mingw* build
4444
cd build
4545

4646
# This may vary by system/CI provider
47-
MSYS_LIB_DIR="/c/rtools40"
47+
MSYS_LIB_DIR="/c/rtools${RTOOLS_VERSION}"
4848

4949
# Untar the builds we made
5050
ls *.xz | xargs -n 1 tar -xJf

cpp/CMakeLists.txt

+3-3
Original file line numberDiff line numberDiff line change
@@ -554,10 +554,10 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ARROW_CXXFLAGS}")
554554
# C++ specific flags.
555555
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CXX_COMMON_FLAGS} ${ARROW_CXXFLAGS}")
556556

557-
# Remove --std=c++17 to avoid errors from C compilers
558-
string(REPLACE "-std=c++17" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
557+
# Remove -std=c++20 to avoid errors from C compilers
558+
string(REPLACE "-std=c++20" "" CMAKE_C_FLAGS ${CMAKE_C_FLAGS})
559559

560-
# Add C++-only flags, like -std=c++17
560+
# Add C++-only flags, like -std=c++20
561561
set(CMAKE_CXX_FLAGS "${CXX_ONLY_FLAGS} ${CMAKE_CXX_FLAGS}")
562562

563563
# ASAN / TSAN / UBSAN

cpp/cmake_modules/GandivaAddBitcode.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
# Create bitcode for the given source file.
1919
function(gandiva_add_bitcode SOURCE)
20-
set(CLANG_OPTIONS -std=c++17)
20+
set(CLANG_OPTIONS -std=c++20)
2121
if(MSVC)
2222
# "19.20" means that it's compatible with Visual Studio 16 2019.
2323
# We can update this to "19.30" when we dropped support for Visual

cpp/cmake_modules/SetupCxxFlags.cmake

+4-4
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,12 @@ endif()
137137

138138
# This ensures that things like c++17 get passed correctly
139139
if(NOT DEFINED CMAKE_CXX_STANDARD)
140-
set(CMAKE_CXX_STANDARD 17)
141-
elseif(${CMAKE_CXX_STANDARD} VERSION_LESS 17)
142-
message(FATAL_ERROR "Cannot set a CMAKE_CXX_STANDARD smaller than 17")
140+
set(CMAKE_CXX_STANDARD 20)
141+
elseif(${CMAKE_CXX_STANDARD} VERSION_LESS 20)
142+
message(FATAL_ERROR "Cannot set a CMAKE_CXX_STANDARD smaller than 20")
143143
endif()
144144

145-
# We require a C++17 compliant compiler
145+
# We require a C++20 compliant compiler
146146
set(CMAKE_CXX_STANDARD_REQUIRED ON)
147147

148148
# ARROW-6848: Do not use GNU (or other CXX) extensions

cpp/examples/minimal_build/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@ option(ARROW_LINK_SHARED "Link to the Arrow shared library" ON)
2424
find_package(Arrow REQUIRED)
2525

2626
if(NOT DEFINED CMAKE_CXX_STANDARD)
27-
set(CMAKE_CXX_STANDARD 17)
27+
set(CMAKE_CXX_STANDARD 20)
2828
endif()
2929

30-
# We require a C++17 compliant compiler
30+
# We require a C++20 compliant compiler
3131
set(CMAKE_CXX_STANDARD_REQUIRED ON)
3232

3333
if(NOT CMAKE_BUILD_TYPE)

cpp/examples/minimal_build/run_static.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ echo
8686

8787
rm -rf $EXAMPLE_BUILD_DIR
8888
mkdir -p $EXAMPLE_BUILD_DIR
89-
${CXX:-c++} -std=c++17 \
89+
${CXX:-c++} -std=c++20 \
9090
-o $EXAMPLE_BUILD_DIR/arrow-example \
9191
$EXAMPLE_DIR/example.cc \
9292
$(PKG_CONFIG_PATH=$ARROW_BUILD_DIR/lib/pkgconfig \

cpp/examples/parquet/parquet_arrow/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ option(PARQUET_LINK_SHARED "Link to the Parquet shared library" ON)
2828

2929
# This ensures that things like -std=gnu++... get passed correctly
3030
if(NOT DEFINED CMAKE_CXX_STANDARD)
31-
set(CMAKE_CXX_STANDARD 17)
31+
set(CMAKE_CXX_STANDARD 20)
3232
endif()
3333

34-
# We require a C++17 compliant compiler
34+
# We require a C++20 compliant compiler
3535
set(CMAKE_CXX_STANDARD_REQUIRED ON)
3636

3737
# Look for installed packages the system

cpp/examples/tutorial_examples/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ project(ArrowTutorialExamples)
2121

2222
find_package(ArrowDataset)
2323

24-
set(CMAKE_CXX_STANDARD 17)
24+
set(CMAKE_CXX_STANDARD 20)
2525
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wall -Wextra")
2626

2727
set(CMAKE_BUILD_TYPE Release)

cpp/meson.build

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ project(
2626
'buildtype=release',
2727
'c_std=c99',
2828
'warning_level=2',
29-
'cpp_std=c++17',
29+
'cpp_std=c++20',
3030
],
3131
)
3232

cpp/src/arrow/array/array_nested.cc

+66-36
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717

1818
#include "arrow/array/array_nested.h"
1919

20-
#include <atomic>
2120
#include <cstddef>
2221
#include <cstdint>
2322
#include <memory>
23+
#include <mutex>
2424
#include <string>
2525
#include <utility>
2626
#include <vector>
@@ -1004,10 +1004,18 @@ Result<std::shared_ptr<Array>> FixedSizeListArray::Flatten(
10041004
// ----------------------------------------------------------------------
10051005
// Struct
10061006

1007+
struct StructArray::Impl {
1008+
std::mutex mutex;
1009+
ArrayVector boxed_fields;
1010+
};
1011+
1012+
StructArray::~StructArray() = default;
1013+
10071014
StructArray::StructArray(const std::shared_ptr<ArrayData>& data) {
10081015
ARROW_CHECK_EQ(data->type->id(), Type::STRUCT);
10091016
SetData(data);
1010-
boxed_fields_.resize(data->child_data.size());
1017+
impl_ = std::make_unique<Impl>();
1018+
impl_->boxed_fields.resize(data_->child_data.size());
10111019
}
10121020

10131021
StructArray::StructArray(const std::shared_ptr<DataType>& type, int64_t length,
@@ -1016,10 +1024,12 @@ StructArray::StructArray(const std::shared_ptr<DataType>& type, int64_t length,
10161024
int64_t offset) {
10171025
ARROW_CHECK_EQ(type->id(), Type::STRUCT);
10181026
SetData(ArrayData::Make(type, length, {std::move(null_bitmap)}, null_count, offset));
1027+
data_->child_data.reserve(children.size());
10191028
for (const auto& child : children) {
10201029
data_->child_data.push_back(child->data());
10211030
}
1022-
boxed_fields_.resize(children.size());
1031+
impl_ = std::make_unique<Impl>();
1032+
impl_->boxed_fields.resize(data_->child_data.size());
10231033
}
10241034

10251035
Result<std::shared_ptr<StructArray>> StructArray::Make(
@@ -1069,27 +1079,32 @@ const StructType* StructArray::struct_type() const {
10691079
return checked_cast<const StructType*>(data_->type.get());
10701080
}
10711081

1082+
std::shared_ptr<Array> StructArray::MakeBoxedField(int i) const {
1083+
std::shared_ptr<ArrayData> field_data;
1084+
if (data_->offset != 0 || data_->child_data[i]->length != data_->length) {
1085+
field_data = data_->child_data[i]->Slice(data_->offset, data_->length);
1086+
} else {
1087+
field_data = data_->child_data[i];
1088+
}
1089+
return MakeArray(field_data);
1090+
}
1091+
10721092
const ArrayVector& StructArray::fields() const {
1093+
std::lock_guard lock(impl_->mutex);
10731094
for (int i = 0; i < num_fields(); ++i) {
1074-
(void)field(i);
1095+
if (impl_->boxed_fields[i] == nullptr) {
1096+
impl_->boxed_fields[i] = MakeBoxedField(i);
1097+
}
10751098
}
1076-
return boxed_fields_;
1099+
return impl_->boxed_fields;
10771100
}
10781101

10791102
const std::shared_ptr<Array>& StructArray::field(int i) const {
1080-
std::shared_ptr<Array> result = std::atomic_load(&boxed_fields_[i]);
1081-
if (!result) {
1082-
std::shared_ptr<ArrayData> field_data;
1083-
if (data_->offset != 0 || data_->child_data[i]->length != data_->length) {
1084-
field_data = data_->child_data[i]->Slice(data_->offset, data_->length);
1085-
} else {
1086-
field_data = data_->child_data[i];
1087-
}
1088-
result = MakeArray(field_data);
1089-
std::atomic_store(&boxed_fields_[i], std::move(result));
1090-
return boxed_fields_[i];
1103+
std::lock_guard lock(impl_->mutex);
1104+
if (impl_->boxed_fields[i] == nullptr) {
1105+
impl_->boxed_fields[i] = MakeBoxedField(i);
10911106
}
1092-
return boxed_fields_[i];
1107+
return impl_->boxed_fields[i];
10931108
}
10941109

10951110
std::shared_ptr<Array> StructArray::GetFieldByName(const std::string& name) const {
@@ -1177,14 +1192,24 @@ Result<std::shared_ptr<Array>> StructArray::GetFlattenedField(int index,
11771192
// ----------------------------------------------------------------------
11781193
// UnionArray
11791194

1195+
struct UnionArray::Impl {
1196+
std::mutex mutex;
1197+
ArrayVector boxed_fields;
1198+
};
1199+
1200+
UnionArray::UnionArray() = default;
1201+
UnionArray::~UnionArray() = default;
1202+
11801203
void UnionArray::SetData(std::shared_ptr<ArrayData> data) {
11811204
this->Array::SetData(std::move(data));
11821205

11831206
union_type_ = checked_cast<const UnionType*>(data_->type.get());
11841207

11851208
ARROW_CHECK_GE(data_->buffers.size(), 2);
11861209
raw_type_codes_ = data->GetValuesSafe<int8_t>(1);
1187-
boxed_fields_.resize(data_->child_data.size());
1210+
1211+
impl_ = std::make_unique<Impl>();
1212+
impl_->boxed_fields.resize(data_->child_data.size());
11881213
}
11891214

11901215
void SparseUnionArray::SetData(std::shared_ptr<ArrayData> data) {
@@ -1198,16 +1223,16 @@ void SparseUnionArray::SetData(std::shared_ptr<ArrayData> data) {
11981223

11991224
void DenseUnionArray::SetData(const std::shared_ptr<ArrayData>& data) {
12001225
this->UnionArray::SetData(data);
1201-
12021226
ARROW_CHECK_EQ(data_->type->id(), Type::DENSE_UNION);
12031227
ARROW_CHECK_EQ(data_->buffers.size(), 3);
12041228

12051229
// No validity bitmap
12061230
ARROW_CHECK_EQ(data_->buffers[0], nullptr);
1207-
12081231
raw_value_offsets_ = data->GetValuesSafe<int32_t>(2);
12091232
}
12101233

1234+
SparseUnionArray::~SparseUnionArray() = default;
1235+
12111236
SparseUnionArray::SparseUnionArray(std::shared_ptr<ArrayData> data) {
12121237
SetData(std::move(data));
12131238
}
@@ -1261,6 +1286,8 @@ Result<std::shared_ptr<Array>> SparseUnionArray::GetFlattenedField(
12611286
return MakeArray(child_data);
12621287
}
12631288

1289+
DenseUnionArray::~DenseUnionArray() = default;
1290+
12641291
DenseUnionArray::DenseUnionArray(const std::shared_ptr<ArrayData>& data) {
12651292
SetData(data);
12661293
}
@@ -1352,26 +1379,29 @@ Result<std::shared_ptr<Array>> SparseUnionArray::Make(
13521379
return std::make_shared<SparseUnionArray>(std::move(internal_data));
13531380
}
13541381

1382+
std::shared_ptr<Array> UnionArray::MakeBoxedField(int i) const {
1383+
std::shared_ptr<ArrayData> child_data = data_->child_data[i]->Copy();
1384+
if (mode() == UnionMode::SPARSE) {
1385+
// Sparse union: need to adjust child if union is sliced
1386+
// (for dense unions, the need to lookup through the offsets
1387+
// makes this unnecessary)
1388+
if (data_->offset != 0 || child_data->length > data_->length) {
1389+
child_data = child_data->Slice(data_->offset, data_->length);
1390+
}
1391+
}
1392+
return MakeArray(child_data);
1393+
}
1394+
13551395
std::shared_ptr<Array> UnionArray::field(int i) const {
1356-
if (i < 0 ||
1357-
static_cast<decltype(boxed_fields_)::size_type>(i) >= boxed_fields_.size()) {
1396+
if (i < 0 || i >= num_fields()) {
13581397
return nullptr;
13591398
}
1360-
std::shared_ptr<Array> result = std::atomic_load(&boxed_fields_[i]);
1361-
if (!result) {
1362-
std::shared_ptr<ArrayData> child_data = data_->child_data[i]->Copy();
1363-
if (mode() == UnionMode::SPARSE) {
1364-
// Sparse union: need to adjust child if union is sliced
1365-
// (for dense unions, the need to lookup through the offsets
1366-
// makes this unnecessary)
1367-
if (data_->offset != 0 || child_data->length > data_->length) {
1368-
child_data = child_data->Slice(data_->offset, data_->length);
1369-
}
1370-
}
1371-
result = MakeArray(child_data);
1372-
std::atomic_store(&boxed_fields_[i], result);
1399+
1400+
std::lock_guard lock(impl_->mutex);
1401+
if (impl_->boxed_fields[i] == nullptr) {
1402+
impl_->boxed_fields[i] = MakeBoxedField(i);
13731403
}
1374-
return result;
1404+
return impl_->boxed_fields[i];
13751405
}
13761406

13771407
} // namespace arrow

0 commit comments

Comments
 (0)