slang_rs_export_foreach.h revision 593a894650e81be54173106ec266f0311cebebd3
15baf6324a97430016026419deaef246ad75430fcStephen Hines/*
25baf6324a97430016026419deaef246ad75430fcStephen Hines * Copyright 2011, The Android Open Source Project
35baf6324a97430016026419deaef246ad75430fcStephen Hines *
45baf6324a97430016026419deaef246ad75430fcStephen Hines * Licensed under the Apache License, Version 2.0 (the "License");
55baf6324a97430016026419deaef246ad75430fcStephen Hines * you may not use this file except in compliance with the License.
65baf6324a97430016026419deaef246ad75430fcStephen Hines * You may obtain a copy of the License at
75baf6324a97430016026419deaef246ad75430fcStephen Hines *
85baf6324a97430016026419deaef246ad75430fcStephen Hines *     http://www.apache.org/licenses/LICENSE-2.0
95baf6324a97430016026419deaef246ad75430fcStephen Hines *
105baf6324a97430016026419deaef246ad75430fcStephen Hines * Unless required by applicable law or agreed to in writing, software
115baf6324a97430016026419deaef246ad75430fcStephen Hines * distributed under the License is distributed on an "AS IS" BASIS,
125baf6324a97430016026419deaef246ad75430fcStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135baf6324a97430016026419deaef246ad75430fcStephen Hines * See the License for the specific language governing permissions and
145baf6324a97430016026419deaef246ad75430fcStephen Hines * limitations under the License.
155baf6324a97430016026419deaef246ad75430fcStephen Hines */
165baf6324a97430016026419deaef246ad75430fcStephen Hines
17593a894650e81be54173106ec266f0311cebebd3Stephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_  // NOLINT
18593a894650e81be54173106ec266f0311cebebd3Stephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_
195baf6324a97430016026419deaef246ad75430fcStephen Hines
205baf6324a97430016026419deaef246ad75430fcStephen Hines#include "llvm/ADT/StringRef.h"
215baf6324a97430016026419deaef246ad75430fcStephen Hines#include "llvm/Support/raw_ostream.h"
225baf6324a97430016026419deaef246ad75430fcStephen Hines
235baf6324a97430016026419deaef246ad75430fcStephen Hines#include "clang/AST/Decl.h"
245baf6324a97430016026419deaef246ad75430fcStephen Hines
255baf6324a97430016026419deaef246ad75430fcStephen Hines#include "slang_assert.h"
265baf6324a97430016026419deaef246ad75430fcStephen Hines#include "slang_rs_context.h"
27593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_exportable.h"
28593a894650e81be54173106ec266f0311cebebd3Stephen Hines#include "slang_rs_export_type.h"
295baf6324a97430016026419deaef246ad75430fcStephen Hines
305baf6324a97430016026419deaef246ad75430fcStephen Hinesnamespace clang {
315baf6324a97430016026419deaef246ad75430fcStephen Hines  class FunctionDecl;
325baf6324a97430016026419deaef246ad75430fcStephen Hines}  // namespace clang
335baf6324a97430016026419deaef246ad75430fcStephen Hines
345baf6324a97430016026419deaef246ad75430fcStephen Hinesnamespace slang {
355baf6324a97430016026419deaef246ad75430fcStephen Hines
36593a894650e81be54173106ec266f0311cebebd3Stephen Hines// Base class for reflecting control-side forEach (currently for root()
37593a894650e81be54173106ec266f0311cebebd3Stephen Hines// functions that fit appropriate criteria)
38593a894650e81be54173106ec266f0311cebebd3Stephen Hinesclass RSExportForEach : public RSExportable {
395baf6324a97430016026419deaef246ad75430fcStephen Hines private:
405baf6324a97430016026419deaef246ad75430fcStephen Hines  std::string mName;
41593a894650e81be54173106ec266f0311cebebd3Stephen Hines  RSExportRecordType *mParamPacketType;
42593a894650e81be54173106ec266f0311cebebd3Stephen Hines  size_t numParams;
435baf6324a97430016026419deaef246ad75430fcStephen Hines
44593a894650e81be54173106ec266f0311cebebd3Stephen Hines  RSExportForEach(RSContext *Context, const llvm::StringRef &Name,
455baf6324a97430016026419deaef246ad75430fcStephen Hines         const clang::FunctionDecl *FD)
46593a894650e81be54173106ec266f0311cebebd3Stephen Hines    : RSExportable(Context, RSExportable::EX_FOREACH),
47593a894650e81be54173106ec266f0311cebebd3Stephen Hines      mName(Name.data(), Name.size()),
48593a894650e81be54173106ec266f0311cebebd3Stephen Hines      mParamPacketType(NULL),
49593a894650e81be54173106ec266f0311cebebd3Stephen Hines      numParams(0) {
505baf6324a97430016026419deaef246ad75430fcStephen Hines    return;
515baf6324a97430016026419deaef246ad75430fcStephen Hines  }
525baf6324a97430016026419deaef246ad75430fcStephen Hines
535baf6324a97430016026419deaef246ad75430fcStephen Hines public:
54593a894650e81be54173106ec266f0311cebebd3Stephen Hines  static RSExportForEach *Create(RSContext *Context,
55593a894650e81be54173106ec266f0311cebebd3Stephen Hines                                 const clang::FunctionDecl *FD);
56593a894650e81be54173106ec266f0311cebebd3Stephen Hines
57593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline const std::string &getName() const {
58593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mName;
59593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
60593a894650e81be54173106ec266f0311cebebd3Stephen Hines
61593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline size_t getNumParameters() const {
62593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return numParams;
63593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
64593a894650e81be54173106ec266f0311cebebd3Stephen Hines
65593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline const RSExportRecordType *getParamPacketType() const
66593a894650e81be54173106ec266f0311cebebd3Stephen Hines    { return mParamPacketType; }
67593a894650e81be54173106ec266f0311cebebd3Stephen Hines
68593a894650e81be54173106ec266f0311cebebd3Stephen Hines  typedef RSExportRecordType::const_field_iterator const_param_iterator;
695baf6324a97430016026419deaef246ad75430fcStephen Hines
70593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline const_param_iterator params_begin() const {
71593a894650e81be54173106ec266f0311cebebd3Stephen Hines    slangAssert((mParamPacketType != NULL) &&
72593a894650e81be54173106ec266f0311cebebd3Stephen Hines                "Get parameter from export foreach having no parameter!");
73593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mParamPacketType->fields_begin();
74593a894650e81be54173106ec266f0311cebebd3Stephen Hines  }
75593a894650e81be54173106ec266f0311cebebd3Stephen Hines  inline const_param_iterator params_end() const {
76593a894650e81be54173106ec266f0311cebebd3Stephen Hines    slangAssert((mParamPacketType != NULL) &&
77593a894650e81be54173106ec266f0311cebebd3Stephen Hines                "Get parameter from export foreach having no parameter!");
78593a894650e81be54173106ec266f0311cebebd3Stephen Hines    return mParamPacketType->fields_end();
795baf6324a97430016026419deaef246ad75430fcStephen Hines  }
805baf6324a97430016026419deaef246ad75430fcStephen Hines
815baf6324a97430016026419deaef246ad75430fcStephen Hines  inline static bool isInitRSFunc(const clang::FunctionDecl *FD) {
825baf6324a97430016026419deaef246ad75430fcStephen Hines    if (!FD) {
835baf6324a97430016026419deaef246ad75430fcStephen Hines      return false;
845baf6324a97430016026419deaef246ad75430fcStephen Hines    }
855baf6324a97430016026419deaef246ad75430fcStephen Hines    const llvm::StringRef Name = FD->getName();
865baf6324a97430016026419deaef246ad75430fcStephen Hines    static llvm::StringRef FuncInit("init");
875baf6324a97430016026419deaef246ad75430fcStephen Hines    return Name.equals(FuncInit);
885baf6324a97430016026419deaef246ad75430fcStephen Hines  }
895baf6324a97430016026419deaef246ad75430fcStephen Hines
905baf6324a97430016026419deaef246ad75430fcStephen Hines  inline static bool isRootRSFunc(const clang::FunctionDecl *FD) {
915baf6324a97430016026419deaef246ad75430fcStephen Hines    if (!FD) {
925baf6324a97430016026419deaef246ad75430fcStephen Hines      return false;
935baf6324a97430016026419deaef246ad75430fcStephen Hines    }
945baf6324a97430016026419deaef246ad75430fcStephen Hines    const llvm::StringRef Name = FD->getName();
955baf6324a97430016026419deaef246ad75430fcStephen Hines    static llvm::StringRef FuncRoot("root");
965baf6324a97430016026419deaef246ad75430fcStephen Hines    return Name.equals(FuncRoot);
975baf6324a97430016026419deaef246ad75430fcStephen Hines  }
985baf6324a97430016026419deaef246ad75430fcStephen Hines
99593a894650e81be54173106ec266f0311cebebd3Stephen Hines  static bool isRSForEachFunc(const clang::FunctionDecl *FD);
100593a894650e81be54173106ec266f0311cebebd3Stephen Hines
1015baf6324a97430016026419deaef246ad75430fcStephen Hines  inline static bool isSpecialRSFunc(const clang::FunctionDecl *FD) {
1025baf6324a97430016026419deaef246ad75430fcStephen Hines    return isRootRSFunc(FD) || isInitRSFunc(FD);
1035baf6324a97430016026419deaef246ad75430fcStephen Hines  }
1045baf6324a97430016026419deaef246ad75430fcStephen Hines
1055baf6324a97430016026419deaef246ad75430fcStephen Hines  static bool validateSpecialFuncDecl(clang::Diagnostic *Diags,
1065baf6324a97430016026419deaef246ad75430fcStephen Hines                                      const clang::FunctionDecl *FD);
107593a894650e81be54173106ec266f0311cebebd3Stephen Hines};  // RSExportForEach
1085baf6324a97430016026419deaef246ad75430fcStephen Hines
1095baf6324a97430016026419deaef246ad75430fcStephen Hines}  // namespace slang
1105baf6324a97430016026419deaef246ad75430fcStephen Hines
111593a894650e81be54173106ec266f0311cebebd3Stephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORT_FOREACH_H_  NOLINT
112