| 187 | } |
| 188 | |
| 189 | std::shared_ptr<ArrayData> ArrayData::Slice(int64_t off, int64_t len) const { |
| 190 | ARROW_CHECK_LE(off, length) << "Slice offset (" << off |
| 191 | << ") greater than array length (" << length << ")"; |
| 192 | len = std::min(length - off, len); |
| 193 | off += offset; |
| 194 | |
| 195 | auto copy = this->Copy(); |
| 196 | copy->length = len; |
| 197 | copy->offset = off; |
| 198 | if (null_count == length) { |
| 199 | copy->null_count = len; |
| 200 | } else if (off == offset && len == length) { // A copy of current. |
| 201 | copy->null_count = null_count.load(); |
| 202 | } else { |
| 203 | copy->null_count = null_count != 0 ? kUnknownNullCount : 0; |
| 204 | } |
| 205 | copy->statistics = nullptr; |
| 206 | return copy; |
| 207 | } |
| 208 | |
| 209 | Result<std::shared_ptr<ArrayData>> ArrayData::SliceSafe(int64_t off, int64_t len) const { |
| 210 | RETURN_NOT_OK(internal::CheckSliceParams(length, off, len, "array")); |