/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed 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.
 */


#ifndef ANDROID_VINTF_VNDK_H
#define ANDROID_VINTF_VNDK_H

#include <set>
#include <string>

namespace android {
namespace vintf {

// deprecated. Kept here for libvintf backwards compatibility.
struct [[deprecated]] VndkVersionRange {

    VndkVersionRange() : VndkVersionRange(0u, 0u, 0u) {}
    VndkVersionRange(size_t s, size_t v, size_t p)
        : VndkVersionRange(s, v, p, p) {}
    VndkVersionRange(size_t s, size_t v, size_t pi, size_t pa)
        : sdk(s), vndk(v), patchMin(pi), patchMax(pa) {}

    inline bool isSingleVersion() const { return patchMin == patchMax; };

    size_t sdk;
    size_t vndk;
    size_t patchMin;
    size_t patchMax;
};

// deprecated. Kept here for libvintf backwards compatibility.
struct [[deprecated]] Vndk {

    const VndkVersionRange &versionRange() const { return mVersionRange; }
    const std::set<std::string> &libraries() const { return mLibraries; }

private:
    friend struct VndkConverter;
    friend struct HalManifestConverter;
    friend struct LibVintfTest;
    friend struct HalManifest;
    friend struct CompatibilityMatrix;
    friend bool operator==(const Vndk &, const Vndk &);
    VndkVersionRange mVersionRange;
    std::set<std::string> mLibraries;
};

[[deprecated]]
inline bool operator==(const VndkVersionRange &lft, const VndkVersionRange &rgt) {
    return lft.sdk == rgt.sdk && lft.vndk == rgt.vndk &&
           lft.patchMin == rgt.patchMin && lft.patchMax == rgt.patchMax;
}

[[deprecated]]
inline bool operator==(const Vndk &lft, const Vndk &rgt) {
    return lft.mVersionRange == rgt.mVersionRange &&
           lft.mLibraries == rgt.mLibraries;
}

} // namespace vintf
} // namespace android

#endif // ANDROID_VINTF_VNDK_H
