Skip to content

Commit 31994b5

Browse files
chrisxu333pitrou
andauthored
GH-37891: [C++] Pass shared_ptr<DataType> by value in SliceBuffer-related constructors (#45466)
### Rationale for this change These changes facilitate the process of moving newly constructed shared_ptr without the need of adding a refcount and still support cases where a reference of a shared_ptr is passed from caller. ### What changes are included in this PR? - Change `SliceBuffer`-related constructor to take `shared_ptr` by value instead of `const &`. - Change `SliceBufferSafe`-related constructor to take `shared_ptr` by value instead of `const &`. - Change `SliceMutableBufferSafe` -related constructors to take `shared_ptr` by value instead of `const &`. ### Are these changes tested? Yes, by existing tests. ### Are there any user-facing changes? No, the API changes should not break any compatibility. * GitHub Issue: #37891 Lead-authored-by: chrisxu333 <chrisxu333@gmail.com> Co-authored-by: Antoine Pitrou <antoine@python.org> Signed-off-by: Antoine Pitrou <antoine@python.org>
1 parent 12cdaaa commit 31994b5

File tree

2 files changed

+26
-26
lines changed

2 files changed

+26
-26
lines changed

cpp/src/arrow/buffer.cc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,28 @@ Status CheckBufferSlice(const Buffer& buffer, int64_t offset) {
6363

6464
} // namespace
6565

66-
Result<std::shared_ptr<Buffer>> SliceBufferSafe(const std::shared_ptr<Buffer>& buffer,
66+
Result<std::shared_ptr<Buffer>> SliceBufferSafe(std::shared_ptr<Buffer> buffer,
6767
int64_t offset) {
6868
RETURN_NOT_OK(CheckBufferSlice(*buffer, offset));
69-
return SliceBuffer(buffer, offset);
69+
return SliceBuffer(std::move(buffer), offset);
7070
}
7171

72-
Result<std::shared_ptr<Buffer>> SliceBufferSafe(const std::shared_ptr<Buffer>& buffer,
72+
Result<std::shared_ptr<Buffer>> SliceBufferSafe(std::shared_ptr<Buffer> buffer,
7373
int64_t offset, int64_t length) {
7474
RETURN_NOT_OK(CheckBufferSlice(*buffer, offset, length));
75-
return SliceBuffer(buffer, offset, length);
75+
return SliceBuffer(std::move(buffer), offset, length);
7676
}
7777

78-
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(
79-
const std::shared_ptr<Buffer>& buffer, int64_t offset) {
78+
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(std::shared_ptr<Buffer> buffer,
79+
int64_t offset) {
8080
RETURN_NOT_OK(CheckBufferSlice(*buffer, offset));
81-
return SliceMutableBuffer(buffer, offset);
81+
return SliceMutableBuffer(std::move(buffer), offset);
8282
}
8383

84-
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(
85-
const std::shared_ptr<Buffer>& buffer, int64_t offset, int64_t length) {
84+
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(std::shared_ptr<Buffer> buffer,
85+
int64_t offset, int64_t length) {
8686
RETURN_NOT_OK(CheckBufferSlice(*buffer, offset, length));
87-
return SliceMutableBuffer(buffer, offset, length);
87+
return SliceMutableBuffer(std::move(buffer), offset, length);
8888
}
8989

9090
std::string Buffer::ToHexString() {
@@ -167,9 +167,9 @@ std::shared_ptr<Buffer> Buffer::FromString(std::string data) {
167167
return std::make_shared<StlStringBuffer>(std::move(data));
168168
}
169169

170-
std::shared_ptr<Buffer> SliceMutableBuffer(const std::shared_ptr<Buffer>& buffer,
170+
std::shared_ptr<Buffer> SliceMutableBuffer(std::shared_ptr<Buffer> buffer,
171171
const int64_t offset, const int64_t length) {
172-
return std::make_shared<MutableBuffer>(buffer, offset, length);
172+
return std::make_shared<MutableBuffer>(std::move(buffer), offset, length);
173173
}
174174

175175
MutableBuffer::MutableBuffer(const std::shared_ptr<Buffer>& parent, const int64_t offset,

cpp/src/arrow/buffer.h

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -396,66 +396,66 @@ class ARROW_EXPORT Buffer {
396396
/// \brief Construct a view on a buffer at the given offset and length.
397397
///
398398
/// This function cannot fail and does not check for errors (except in debug builds)
399-
static inline std::shared_ptr<Buffer> SliceBuffer(const std::shared_ptr<Buffer>& buffer,
399+
static inline std::shared_ptr<Buffer> SliceBuffer(std::shared_ptr<Buffer> buffer,
400400
const int64_t offset,
401401
const int64_t length) {
402-
return std::make_shared<Buffer>(buffer, offset, length);
402+
return std::make_shared<Buffer>(std::move(buffer), offset, length);
403403
}
404404

405405
/// \brief Construct a view on a buffer at the given offset, up to the buffer's end.
406406
///
407407
/// This function cannot fail and does not check for errors (except in debug builds)
408-
static inline std::shared_ptr<Buffer> SliceBuffer(const std::shared_ptr<Buffer>& buffer,
408+
static inline std::shared_ptr<Buffer> SliceBuffer(std::shared_ptr<Buffer> buffer,
409409
const int64_t offset) {
410410
int64_t length = buffer->size() - offset;
411-
return SliceBuffer(buffer, offset, length);
411+
return SliceBuffer(std::move(buffer), offset, length);
412412
}
413413

414414
/// \brief Input-checking version of SliceBuffer
415415
///
416416
/// An Invalid Status is returned if the requested slice falls out of bounds.
417417
ARROW_EXPORT
418-
Result<std::shared_ptr<Buffer>> SliceBufferSafe(const std::shared_ptr<Buffer>& buffer,
418+
Result<std::shared_ptr<Buffer>> SliceBufferSafe(std::shared_ptr<Buffer> buffer,
419419
int64_t offset);
420420
/// \brief Input-checking version of SliceBuffer
421421
///
422422
/// An Invalid Status is returned if the requested slice falls out of bounds.
423423
/// Note that unlike SliceBuffer, `length` isn't clamped to the available buffer size.
424424
ARROW_EXPORT
425-
Result<std::shared_ptr<Buffer>> SliceBufferSafe(const std::shared_ptr<Buffer>& buffer,
425+
Result<std::shared_ptr<Buffer>> SliceBufferSafe(std::shared_ptr<Buffer> buffer,
426426
int64_t offset, int64_t length);
427427

428428
/// \brief Like SliceBuffer, but construct a mutable buffer slice.
429429
///
430430
/// If the parent buffer is not mutable, behavior is undefined (it may abort
431431
/// in debug builds).
432432
ARROW_EXPORT
433-
std::shared_ptr<Buffer> SliceMutableBuffer(const std::shared_ptr<Buffer>& buffer,
433+
std::shared_ptr<Buffer> SliceMutableBuffer(std::shared_ptr<Buffer> buffer,
434434
const int64_t offset, const int64_t length);
435435

436436
/// \brief Like SliceBuffer, but construct a mutable buffer slice.
437437
///
438438
/// If the parent buffer is not mutable, behavior is undefined (it may abort
439439
/// in debug builds).
440-
static inline std::shared_ptr<Buffer> SliceMutableBuffer(
441-
const std::shared_ptr<Buffer>& buffer, const int64_t offset) {
440+
static inline std::shared_ptr<Buffer> SliceMutableBuffer(std::shared_ptr<Buffer> buffer,
441+
const int64_t offset) {
442442
int64_t length = buffer->size() - offset;
443-
return SliceMutableBuffer(buffer, offset, length);
443+
return SliceMutableBuffer(std::move(buffer), offset, length);
444444
}
445445

446446
/// \brief Input-checking version of SliceMutableBuffer
447447
///
448448
/// An Invalid Status is returned if the requested slice falls out of bounds.
449449
ARROW_EXPORT
450-
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(
451-
const std::shared_ptr<Buffer>& buffer, int64_t offset);
450+
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(std::shared_ptr<Buffer> buffer,
451+
int64_t offset);
452452
/// \brief Input-checking version of SliceMutableBuffer
453453
///
454454
/// An Invalid Status is returned if the requested slice falls out of bounds.
455455
/// Note that unlike SliceBuffer, `length` isn't clamped to the available buffer size.
456456
ARROW_EXPORT
457-
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(
458-
const std::shared_ptr<Buffer>& buffer, int64_t offset, int64_t length);
457+
Result<std::shared_ptr<Buffer>> SliceMutableBufferSafe(std::shared_ptr<Buffer> buffer,
458+
int64_t offset, int64_t length);
459459

460460
/// @}
461461

0 commit comments

Comments
 (0)