Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ea3e49e authored by Jooyung Han's avatar Jooyung Han Committed by Automerger Merge Worker
Browse files

libbinder_ndk: utils for vector<SpAIBinder> am: 58488fe0

Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/1856219

Change-Id: I7ca5f3a17495ec9c6975ed6ca608371b57085ef6
parents f236a83b 58488fe0
Loading
Loading
Loading
Loading
+94 −0
Original line number Diff line number Diff line
@@ -542,6 +542,28 @@ binder_status_t AParcel_readStdVectorParcelableElement(const AParcel* parcel, vo
    return AParcel_readParcelable(parcel, &vector->at(index));
}

/**
 * Writes a parcelable object of type P inside a std::vector<P> at index 'index' to 'parcel'.
 */
template <typename P>
binder_status_t AParcel_writeNullableStdVectorParcelableElement(AParcel* parcel,
                                                                const void* vectorData,
                                                                size_t index) {
    const std::optional<std::vector<P>>* vector =
            static_cast<const std::optional<std::vector<P>*>>(vectorData);
    return AParcel_writeNullableParcelable(parcel, vector->at(index));
}

/**
 * Reads a parcelable object of type P inside a std::vector<P> at index 'index' from 'parcel'.
 */
template <typename P>
binder_status_t AParcel_readNullableStdVectorParcelableElement(const AParcel* parcel,
                                                               void* vectorData, size_t index) {
    std::optional<std::vector<P>>* vector = static_cast<std::optional<std::vector<P>>*>(vectorData);
    return AParcel_readNullableParcelable(parcel, &vector->at(index));
}

/**
 * Writes a ScopedFileDescriptor object inside a std::vector<ScopedFileDescriptor> at index 'index'
 * to 'parcel'.
@@ -578,6 +600,54 @@ inline binder_status_t AParcel_readStdVectorParcelableElement<ScopedFileDescript
    return status;
}

/**
 * Writes an SpAIBinder object inside a std::vector<SpAIBinder> at index 'index'
 * to 'parcel'.
 */
template <>
inline binder_status_t AParcel_writeStdVectorParcelableElement<SpAIBinder>(AParcel* parcel,
                                                                           const void* vectorData,
                                                                           size_t index) {
    const std::vector<SpAIBinder>* vector = static_cast<const std::vector<SpAIBinder>*>(vectorData);
    return AParcel_writeRequiredStrongBinder(parcel, vector->at(index));
}

/**
 * Reads an SpAIBinder object inside a std::vector<SpAIBinder> at index 'index'
 * from 'parcel'.
 */
template <>
inline binder_status_t AParcel_readStdVectorParcelableElement<SpAIBinder>(const AParcel* parcel,
                                                                          void* vectorData,
                                                                          size_t index) {
    std::vector<SpAIBinder>* vector = static_cast<std::vector<SpAIBinder>*>(vectorData);
    return AParcel_readRequiredStrongBinder(parcel, &vector->at(index));
}

/**
 * Writes an SpAIBinder object inside a std::optional<std::vector<SpAIBinder>> at index 'index'
 * to 'parcel'.
 */
template <>
inline binder_status_t AParcel_writeNullableStdVectorParcelableElement<SpAIBinder>(
        AParcel* parcel, const void* vectorData, size_t index) {
    const std::optional<std::vector<SpAIBinder>>* vector =
            static_cast<const std::optional<std::vector<SpAIBinder>>*>(vectorData);
    return AParcel_writeNullableStrongBinder(parcel, (*vector)->at(index));
}

/**
 * Reads an SpAIBinder object inside a std::optional<std::vector<SpAIBinder>> at index 'index'
 * from 'parcel'.
 */
template <>
inline binder_status_t AParcel_readNullableStdVectorParcelableElement<SpAIBinder>(
        const AParcel* parcel, void* vectorData, size_t index) {
    std::optional<std::vector<SpAIBinder>>* vector =
            static_cast<std::optional<std::vector<SpAIBinder>>*>(vectorData);
    return AParcel_readNullableStrongBinder(parcel, &(*vector)->at(index));
}

/**
 * Convenience API for writing a std::vector<P>
 */
@@ -598,6 +668,30 @@ static inline binder_status_t AParcel_readVector(const AParcel* parcel, std::vec
                                       AParcel_readStdVectorParcelableElement<P>);
}

/**
 * Convenience API for writing a std::optional<std::vector<P>>
 */
template <typename P>
static inline binder_status_t AParcel_writeVector(AParcel* parcel,
                                                  const std::optional<std::vector<P>>& vec) {
    if (!vec) return AParcel_writeInt32(parcel, -1);
    const void* vectorData = static_cast<const void*>(&vec);
    return AParcel_writeParcelableArray(parcel, vectorData, static_cast<int32_t>(vec->size()),
                                        AParcel_writeNullableStdVectorParcelableElement<P>);
}

/**
 * Convenience API for reading a std::optional<std::vector<P>>
 */
template <typename P>
static inline binder_status_t AParcel_readVector(const AParcel* parcel,
                                                 std::optional<std::vector<P>>* vec) {
    void* vectorData = static_cast<void*>(vec);
    return AParcel_readParcelableArray(parcel, vectorData,
                                       AParcel_nullableStdVectorExternalAllocator<P>,
                                       AParcel_readNullableStdVectorParcelableElement<P>);
}

// @START
/**
 * Writes a vector of int32_t to the next location in a non-null parcel.