slang_rs_export_func.h revision 6315f76e3cc6ff2d012d1183a0b030d4ff0dc808
16315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#ifndef _SLANG_COMPILER_RS_EXPORT_FUNC_H
26315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#define _SLANG_COMPILER_RS_EXPORT_FUNC_H
3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <list>
5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include <string>
6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
76315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "llvm/ADT/StringRef.h"
86315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr
9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace clang {
106315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class FunctionDecl;
119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace clang
12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang {
14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
156315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSContext;
166315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSExportType;
176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  class RSExportRecordType;
18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoclass RSExportFunc {
209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  friend class RSContext;
219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  class Parameter {
239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   private:
249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    RSExportType *mType;
25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    std::string mName;
26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao   public:
286315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr    Parameter(RSExportType *T, const llvm::StringRef &Name)
296315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        : mType(T),
306315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr          mName(Name.data(), Name.size()) {
319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      return;
32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const RSExportType *getType() const { return mType; }
359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    inline const std::string &getName() const { return mName; }
369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  };
379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao private:
399ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  RSContext *mContext;
409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::string mName;
419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  std::list<const Parameter*> mParams;
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  mutable RSExportRecordType *mParamPacketType;
439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
446315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr  RSExportFunc(RSContext *Context, const llvm::StringRef &Name)
456315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr      : mContext(Context),
466315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        mName(Name.data(), Name.size()),
476315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr        mParamPacketType(NULL) {
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return;
499ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao public:
529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  static RSExportFunc *Create(RSContext *Context,
539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao                              const clang::FunctionDecl *FD);
54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  typedef std::list<const Parameter*>::const_iterator const_param_iterator;
56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_begin() const {
589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return this->mParams.begin();
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const_param_iterator params_end() const {
619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return this->mParams.end();
629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
63462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline const std::string &getName() const {
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mName;
669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline RSContext *getRSContext() const {
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mContext;
699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline bool hasParam() const {
729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return !mParams.empty();
739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  inline int getNumParameters() const {
759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    return mParams.size();
769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
77462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  const RSExportRecordType *getParamPacketType() const;
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  ~RSExportFunc();
819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao};  // RSExportFunc
82462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao}   // namespace slang
84462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
856315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif  // _SLANG_COMPILER_RS_EXPORT_FUNC_H
86