| 919 | namespace internal { |
| 920 | |
| 921 | Result<std::shared_ptr<Array>> Concatenate( |
| 922 | const ArrayVector& arrays, MemoryPool* pool, |
| 923 | std::shared_ptr<DataType>* out_suggested_cast) { |
| 924 | DCHECK(out_suggested_cast); |
| 925 | *out_suggested_cast = nullptr; |
| 926 | if (arrays.size() == 0) { |
| 927 | return Status::Invalid("Must pass at least one array"); |
| 928 | } |
| 929 | |
| 930 | // gather ArrayData of input arrays |
| 931 | ArrayDataVector data(arrays.size()); |
| 932 | for (size_t i = 0; i < arrays.size(); ++i) { |
| 933 | if (!arrays[i]->type()->Equals(*arrays[0]->type())) { |
| 934 | return Status::Invalid("arrays to be concatenated must be identically typed, but ", |
| 935 | *arrays[0]->type(), " and ", *arrays[i]->type(), |
| 936 | " were encountered."); |
| 937 | } |
| 938 | data[i] = arrays[i]->data(); |
| 939 | } |
| 940 | |
| 941 | std::shared_ptr<ArrayData> out_data; |
| 942 | ErrorHints hints; |
| 943 | auto status = ConcatenateImpl(data, pool).Concatenate(&out_data, &hints); |
| 944 | if (!status.ok()) { |
| 945 | if (hints.suggested_cast) { |
| 946 | DCHECK(status.IsInvalid()); |
| 947 | *out_suggested_cast = std::move(hints.suggested_cast); |
| 948 | } |
| 949 | return status; |
| 950 | } |
| 951 | return MakeArray(std::move(out_data)); |
| 952 | } |
| 953 | |
| 954 | } // namespace internal |
| 955 | |