1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/*
2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project
3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License");
5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License.
6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at
7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *     http://www.apache.org/licenses/LICENSE-2.0
9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang *
10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software
11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS,
12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and
14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License.
15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */
16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang
17e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifndef _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORTABLE_H_  // NOLINT
18e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#define _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORTABLE_H_
19a41ce1d98094da84643995d40d71c529905123fcZonr Chang
20a41ce1d98094da84643995d40d71c529905123fcZonr Chang#include "slang_rs_context.h"
21a41ce1d98094da84643995d40d71c529905123fcZonr Chang
22a41ce1d98094da84643995d40d71c529905123fcZonr Changnamespace slang {
23a41ce1d98094da84643995d40d71c529905123fcZonr Chang
24a41ce1d98094da84643995d40d71c529905123fcZonr Changclass RSExportable {
25b257301a1c711ba81458a4f8bf3c99c91c91a047Zonr Chang public:
26a41ce1d98094da84643995d40d71c529905123fcZonr Chang  enum Kind {
27a41ce1d98094da84643995d40d71c529905123fcZonr Chang    EX_FUNC,
28a41ce1d98094da84643995d40d71c529905123fcZonr Chang    EX_TYPE,
29593a894650e81be54173106ec266f0311cebebd3Stephen Hines    EX_VAR,
30c0c5dd85f2d2df2bcf0cb284001f544d6c42eff9Matt Wala    EX_FOREACH,
318ee018bdb53fc5abdc430878e2bec0c0c0aa560fDavid Gross    EX_REDUCE
32a41ce1d98094da84643995d40d71c529905123fcZonr Chang  };
33a41ce1d98094da84643995d40d71c529905123fcZonr Chang
34b257301a1c711ba81458a4f8bf3c99c91c91a047Zonr Chang private:
35641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  RSContext *mContext;
36641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
37a41ce1d98094da84643995d40d71c529905123fcZonr Chang  Kind mK;
38a41ce1d98094da84643995d40d71c529905123fcZonr Chang
39b257301a1c711ba81458a4f8bf3c99c91c91a047Zonr Chang protected:
40641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  RSExportable(RSContext *Context, RSExportable::Kind K)
41641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang      : mContext(Context),
42641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang        mK(K) {
43a41ce1d98094da84643995d40d71c529905123fcZonr Chang    Context->newExportable(this);
44a41ce1d98094da84643995d40d71c529905123fcZonr Chang  }
45a41ce1d98094da84643995d40d71c529905123fcZonr Chang
46b257301a1c711ba81458a4f8bf3c99c91c91a047Zonr Chang public:
47a41ce1d98094da84643995d40d71c529905123fcZonr Chang  inline Kind getKind() const { return mK; }
48a41ce1d98094da84643995d40d71c529905123fcZonr Chang
49641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  // When keep() is invoked, mKeep will set to true and the associated RSContext
5015e44e66adc350adb4fe0533a442092c64333ab5David Gross  // won't free this RSExportable object in its destructor. The deallocation
51641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  // responsibility is then transferred to the object who invoked this function.
523cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang  // Return false if the exportable is kept or failed to keep.
533cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang  virtual bool keep();
545abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes  inline bool isKeep() const { return (mContext == nullptr); }
55641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
56641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  virtual bool equals(const RSExportable *E) const;
57641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
58641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang  inline RSContext *getRSContext() const { return mContext; }
59641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang
60a41ce1d98094da84643995d40d71c529905123fcZonr Chang  virtual ~RSExportable() { }
61a41ce1d98094da84643995d40d71c529905123fcZonr Chang};
62e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines}  // namespace slang
63a41ce1d98094da84643995d40d71c529905123fcZonr Chang
64e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#endif  // _FRAMEWORKS_COMPILE_SLANG_SLANG_RS_EXPORTABLE_H_  NOLINT
65