155 lines
4.8 KiB
Cython
155 lines
4.8 KiB
Cython
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
|
|
# distutils: language = c++
|
|
|
|
from libc.stdint cimport *
|
|
|
|
from libcpp cimport bool as c_bool, nullptr
|
|
from libcpp.functional cimport function
|
|
from libcpp.memory cimport (shared_ptr, unique_ptr, make_shared,
|
|
static_pointer_cast, dynamic_pointer_cast)
|
|
from libcpp.optional cimport nullopt, optional
|
|
from libcpp.string cimport string as c_string
|
|
from libcpp.utility cimport move, pair
|
|
from libcpp.vector cimport vector
|
|
from libcpp.unordered_map cimport unordered_map
|
|
from libcpp.unordered_set cimport unordered_set
|
|
|
|
from cpython cimport PyObject
|
|
from cpython.datetime cimport PyDateTime_DateTime
|
|
cimport cpython
|
|
|
|
|
|
cdef extern from "<string_view>" namespace "std" nogil:
|
|
# Needed until https://github.com/cython/cython/issues/6651 is fixed
|
|
cdef cppclass cpp_string_view "std::string_view":
|
|
string_view()
|
|
string_view(const char*)
|
|
string_view(c_string&)
|
|
size_t size()
|
|
bint empty()
|
|
const char* data()
|
|
|
|
|
|
cdef extern from * namespace "arrow::py" nogil:
|
|
"""
|
|
#include <memory>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <utility>
|
|
|
|
namespace arrow {
|
|
namespace py {
|
|
|
|
template <typename T>
|
|
std::shared_ptr<T> to_shared(std::unique_ptr<T>& t) {
|
|
return std::move(t);
|
|
}
|
|
template <typename T>
|
|
std::shared_ptr<T> to_shared(std::unique_ptr<T>&& t) {
|
|
return std::move(t);
|
|
}
|
|
|
|
// Needed until https://github.com/cython/cython/issues/6651 is fixed
|
|
inline std::string to_string(std::string_view s) {
|
|
return std::string(s);
|
|
}
|
|
|
|
} // namespace py
|
|
} // namespace arrow
|
|
"""
|
|
cdef shared_ptr[T] to_shared" arrow::py::to_shared"[T](unique_ptr[T])
|
|
cdef c_string to_string(cpp_string_view s)
|
|
|
|
cdef extern from "arrow/python/platform.h":
|
|
pass
|
|
|
|
cdef extern from "<Python.h>":
|
|
void Py_XDECREF(PyObject* o)
|
|
Py_ssize_t Py_REFCNT(PyObject* o)
|
|
|
|
cdef extern from "arrow/api.h" namespace "arrow" nogil:
|
|
# We can later add more of the common status factory methods as needed
|
|
cdef CStatus CStatus_OK "arrow::Status::OK"()
|
|
|
|
cdef CStatus CStatus_Invalid "arrow::Status::Invalid"()
|
|
cdef CStatus CStatus_NotImplemented \
|
|
"arrow::Status::NotImplemented"(const c_string& msg)
|
|
cdef CStatus CStatus_UnknownError \
|
|
"arrow::Status::UnknownError"(const c_string& msg)
|
|
|
|
cdef cppclass CStatus "arrow::Status":
|
|
CStatus()
|
|
|
|
c_string ToString()
|
|
c_string message()
|
|
shared_ptr[CStatusDetail] detail()
|
|
|
|
c_bool ok()
|
|
c_bool IsIOError()
|
|
c_bool IsOutOfMemory()
|
|
c_bool IsInvalid()
|
|
c_bool IsKeyError()
|
|
c_bool IsNotImplemented()
|
|
c_bool IsTypeError()
|
|
c_bool IsCapacityError()
|
|
c_bool IsIndexError()
|
|
c_bool IsSerializationError()
|
|
c_bool IsCancelled()
|
|
|
|
void Warn()
|
|
|
|
cdef cppclass CStatusDetail "arrow::StatusDetail":
|
|
c_string ToString()
|
|
|
|
|
|
cdef extern from "arrow/result.h" namespace "arrow" nogil:
|
|
cdef cppclass CResult "arrow::Result"[T]:
|
|
CResult()
|
|
CResult(CStatus)
|
|
CResult(T)
|
|
c_bool ok()
|
|
CStatus status()
|
|
CStatus Value(T*)
|
|
T operator*()
|
|
|
|
|
|
cdef extern from "arrow/util/future.h" namespace "arrow" nogil:
|
|
cdef cppclass CFuture "arrow::Future"[T]:
|
|
CFuture()
|
|
|
|
|
|
cdef extern from "arrow/python/async.h" namespace "arrow::py" nogil:
|
|
# BindFuture's third argument is really a C++ callable with
|
|
# the signature `object(T*)`, but Cython does not allow declaring that.
|
|
# We use an ellipsis as a workaround.
|
|
# Another possibility is to type-erase the argument by making it
|
|
# `object(void*)`, but it would lose compile-time C++ type safety.
|
|
void BindFuture[T](CFuture[T], object cb, ...)
|
|
|
|
|
|
cdef extern from "arrow/python/common.h" namespace "arrow::py" nogil:
|
|
T GetResultValue[T](CResult[T]) except *
|
|
cdef function[F] BindFunction[F](void* unbound, object bound, ...)
|
|
|
|
|
|
cdef inline object PyObject_to_object(PyObject* o):
|
|
# Cast to "object" increments reference count
|
|
cdef object result = <object> o
|
|
cpython.Py_DECREF(result)
|
|
return result
|