xref: /aosp_15_r20/system/libvintf/include/vintf/FQName.h (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
1*70a7ec85SAndroid Build Coastguard Worker /*
2*70a7ec85SAndroid Build Coastguard Worker  * Copyright (C) 2023 The Android Open Source Project
3*70a7ec85SAndroid Build Coastguard Worker  *
4*70a7ec85SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*70a7ec85SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*70a7ec85SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*70a7ec85SAndroid Build Coastguard Worker  *
8*70a7ec85SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*70a7ec85SAndroid Build Coastguard Worker  *
10*70a7ec85SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*70a7ec85SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*70a7ec85SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*70a7ec85SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*70a7ec85SAndroid Build Coastguard Worker  * limitations under the License.
15*70a7ec85SAndroid Build Coastguard Worker  */
16*70a7ec85SAndroid Build Coastguard Worker 
17*70a7ec85SAndroid Build Coastguard Worker #pragma once
18*70a7ec85SAndroid Build Coastguard Worker 
19*70a7ec85SAndroid Build Coastguard Worker #include <string>
20*70a7ec85SAndroid Build Coastguard Worker #include <vector>
21*70a7ec85SAndroid Build Coastguard Worker 
22*70a7ec85SAndroid Build Coastguard Worker namespace android::vintf::details {
23*70a7ec85SAndroid Build Coastguard Worker 
24*70a7ec85SAndroid Build Coastguard Worker struct FQName {
25*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) static bool parse(const std::string& s, FQName* into);
26*70a7ec85SAndroid Build Coastguard Worker 
27*70a7ec85SAndroid Build Coastguard Worker     explicit FQName();
28*70a7ec85SAndroid Build Coastguard Worker 
29*70a7ec85SAndroid Build Coastguard Worker     FQName(const std::string& package, const std::string& version, const std::string& name = "");
30*70a7ec85SAndroid Build Coastguard Worker 
31*70a7ec85SAndroid Build Coastguard Worker     // Returns false if string isn't a valid FQName object.
32*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) bool setTo(const std::string& s);
33*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) bool setTo(const std::string& package, size_t majorVer,
34*70a7ec85SAndroid Build Coastguard Worker                                                    size_t minorVer, const std::string& name = "");
35*70a7ec85SAndroid Build Coastguard Worker 
36*70a7ec85SAndroid Build Coastguard Worker     const std::string& package() const;
37*70a7ec85SAndroid Build Coastguard Worker     // Return version in the form "1.0" if it is present, otherwise empty string.
38*70a7ec85SAndroid Build Coastguard Worker     std::string version() const;
39*70a7ec85SAndroid Build Coastguard Worker     // Return true only if version is present.
40*70a7ec85SAndroid Build Coastguard Worker     bool hasVersion() const;
41*70a7ec85SAndroid Build Coastguard Worker     // Return pair of (major, minor) version. Defaults to 0, 0.
42*70a7ec85SAndroid Build Coastguard Worker     std::pair<size_t, size_t> getVersion() const;
43*70a7ec85SAndroid Build Coastguard Worker 
44*70a7ec85SAndroid Build Coastguard Worker     // The next method return the name part of the FQName, that is, the
45*70a7ec85SAndroid Build Coastguard Worker     // part after the version field.  For example:
46*70a7ec85SAndroid Build Coastguard Worker     //
47*70a7ec85SAndroid Build Coastguard Worker     // package [email protected];
48*70a7ec85SAndroid Build Coastguard Worker     // interface IFoo {
49*70a7ec85SAndroid Build Coastguard Worker     //    struct bar {
50*70a7ec85SAndroid Build Coastguard Worker     //        struct baz {
51*70a7ec85SAndroid Build Coastguard Worker     //            ...
52*70a7ec85SAndroid Build Coastguard Worker     //        };
53*70a7ec85SAndroid Build Coastguard Worker     //    };
54*70a7ec85SAndroid Build Coastguard Worker     // };
55*70a7ec85SAndroid Build Coastguard Worker     //
56*70a7ec85SAndroid Build Coastguard Worker     // package [email protected];
57*70a7ec85SAndroid Build Coastguard Worker     // import [email protected];
58*70a7ec85SAndroid Build Coastguard Worker     // interface {
59*70a7ec85SAndroid Build Coastguard Worker     //    struct boo {
60*70a7ec85SAndroid Build Coastguard Worker     //        IFoo.bar.baz base;
61*70a7ec85SAndroid Build Coastguard Worker     //    };
62*70a7ec85SAndroid Build Coastguard Worker     // }
63*70a7ec85SAndroid Build Coastguard Worker     //
64*70a7ec85SAndroid Build Coastguard Worker     // The FQName for base is [email protected]::IFoo.bar.baz; so
65*70a7ec85SAndroid Build Coastguard Worker     // FQName::name() will return "IFoo.bar.baz".
66*70a7ec85SAndroid Build Coastguard Worker     const std::string& name() const;
67*70a7ec85SAndroid Build Coastguard Worker 
68*70a7ec85SAndroid Build Coastguard Worker     // Interface names start with 'I'
69*70a7ec85SAndroid Build Coastguard Worker     bool isInterfaceName() const;
70*70a7ec85SAndroid Build Coastguard Worker 
71*70a7ec85SAndroid Build Coastguard Worker     std::string string() const;
72*70a7ec85SAndroid Build Coastguard Worker 
73*70a7ec85SAndroid Build Coastguard Worker     bool operator<(const FQName& other) const;
74*70a7ec85SAndroid Build Coastguard Worker     bool operator==(const FQName& other) const;
75*70a7ec85SAndroid Build Coastguard Worker     bool operator!=(const FQName& other) const;
76*70a7ec85SAndroid Build Coastguard Worker 
77*70a7ec85SAndroid Build Coastguard Worker     // Must be called on an interface
78*70a7ec85SAndroid Build Coastguard Worker     // [email protected]::IBar
79*70a7ec85SAndroid Build Coastguard Worker     // -> IBar
80*70a7ec85SAndroid Build Coastguard Worker     const std::string& getInterfaceName() const;
81*70a7ec85SAndroid Build Coastguard Worker 
82*70a7ec85SAndroid Build Coastguard Worker     // [email protected]::Abc.Type:VALUE
83*70a7ec85SAndroid Build Coastguard Worker     // -> [email protected]
84*70a7ec85SAndroid Build Coastguard Worker     FQName getPackageAndVersion() const;
85*70a7ec85SAndroid Build Coastguard Worker 
86*70a7ec85SAndroid Build Coastguard Worker     // If this is [email protected]::IFoo
87*70a7ec85SAndroid Build Coastguard Worker     // package = "and" -> false
88*70a7ec85SAndroid Build Coastguard Worker     // package = "android" -> true
89*70a7ec85SAndroid Build Coastguard Worker     // package = "[email protected]" -> false
90*70a7ec85SAndroid Build Coastguard Worker     bool inPackage(const std::string& package) const;
91*70a7ec85SAndroid Build Coastguard Worker 
92*70a7ec85SAndroid Build Coastguard Worker     // return major and minor version if they exist, else abort program.
93*70a7ec85SAndroid Build Coastguard Worker     // Existence of version can be checked via hasVersion().
94*70a7ec85SAndroid Build Coastguard Worker     size_t getPackageMajorVersion() const;
95*70a7ec85SAndroid Build Coastguard Worker     size_t getPackageMinorVersion() const;
96*70a7ec85SAndroid Build Coastguard Worker 
97*70a7ec85SAndroid Build Coastguard Worker    private:
98*70a7ec85SAndroid Build Coastguard Worker     bool mIsIdentifier;
99*70a7ec85SAndroid Build Coastguard Worker     std::string mPackage;
100*70a7ec85SAndroid Build Coastguard Worker     // mMajor == 0 means empty.
101*70a7ec85SAndroid Build Coastguard Worker     size_t mMajor = 0;
102*70a7ec85SAndroid Build Coastguard Worker     size_t mMinor = 0;
103*70a7ec85SAndroid Build Coastguard Worker     std::string mName;
104*70a7ec85SAndroid Build Coastguard Worker 
105*70a7ec85SAndroid Build Coastguard Worker     void clear();
106*70a7ec85SAndroid Build Coastguard Worker 
107*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) bool setVersion(const std::string& v);
108*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) bool parseVersion(const std::string& majorStr,
109*70a7ec85SAndroid Build Coastguard Worker                                                           const std::string& minorStr);
110*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) static bool parseVersion(const std::string& majorStr,
111*70a7ec85SAndroid Build Coastguard Worker                                                                  const std::string& minorStr,
112*70a7ec85SAndroid Build Coastguard Worker                                                                  size_t* majorVer,
113*70a7ec85SAndroid Build Coastguard Worker                                                                  size_t* minorVer);
114*70a7ec85SAndroid Build Coastguard Worker     __attribute__((warn_unused_result)) static bool parseVersion(const std::string& v,
115*70a7ec85SAndroid Build Coastguard Worker                                                                  size_t* majorVer,
116*70a7ec85SAndroid Build Coastguard Worker                                                                  size_t* minorVer);
117*70a7ec85SAndroid Build Coastguard Worker     static void clearVersion(size_t* majorVer, size_t* minorVer);
118*70a7ec85SAndroid Build Coastguard Worker 
119*70a7ec85SAndroid Build Coastguard Worker     void clearVersion();
120*70a7ec85SAndroid Build Coastguard Worker 
121*70a7ec85SAndroid Build Coastguard Worker     bool isIdentifier() const;
122*70a7ec85SAndroid Build Coastguard Worker     // Return version in the form "@1.0" if it is present, otherwise empty string.
123*70a7ec85SAndroid Build Coastguard Worker     std::string atVersion() const;
124*70a7ec85SAndroid Build Coastguard Worker 
125*70a7ec85SAndroid Build Coastguard Worker     std::vector<std::string> getPackageComponents() const;
126*70a7ec85SAndroid Build Coastguard Worker };
127*70a7ec85SAndroid Build Coastguard Worker 
128*70a7ec85SAndroid Build Coastguard Worker }  // namespace android::vintf::details
129