aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/java/src/gen/cc/java_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/java/src/gen/cc/java_defs.h')
-rw-r--r--tensorflow/java/src/gen/cc/java_defs.h273
1 files changed, 273 insertions, 0 deletions
diff --git a/tensorflow/java/src/gen/cc/java_defs.h b/tensorflow/java/src/gen/cc/java_defs.h
new file mode 100644
index 0000000000..615cdc165b
--- /dev/null
+++ b/tensorflow/java/src/gen/cc/java_defs.h
@@ -0,0 +1,273 @@
+/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
+
+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 TENSORFLOW_JAVA_SRC_GEN_CC_JAVA_DEFS_H_
+#define TENSORFLOW_JAVA_SRC_GEN_CC_JAVA_DEFS_H_
+
+#include <string>
+#include <vector>
+#include <deque>
+
+#include "tensorflow/core/platform/env.h"
+
+namespace tensorflow {
+namespace java {
+
+// An enumeration of different modifiers commonly used in Java
+enum Modifier {
+ PUBLIC = (1 << 0),
+ PROTECTED = (1 << 1),
+ PRIVATE = (1 << 2),
+ STATIC = (1 << 3),
+ FINAL = (1 << 4),
+};
+
+class Annotation;
+
+// A definition of any kind of Java type (classes, interfaces...)
+//
+// Note that most of the data fields of this class are only useful in specific
+// contexts and are not required in many cases. For example, annotations and
+// supertypes are only useful when declaring a type.
+class Type {
+ public:
+ enum Kind {
+ PRIMITIVE, CLASS, INTERFACE, ENUM, GENERIC, ANNOTATION
+ };
+ static const Type Byte() {
+ return Type(Type::PRIMITIVE, "byte");
+ }
+ static const Type Char() {
+ return Type(Type::PRIMITIVE, "char");
+ }
+ static const Type Short() {
+ return Type(Type::PRIMITIVE, "short");
+ }
+ static const Type Int() {
+ return Type(Type::PRIMITIVE, "int");
+ }
+ static const Type Long() {
+ return Type(Type::PRIMITIVE, "long");
+ }
+ static const Type Float() {
+ return Type(Type::PRIMITIVE, "float");
+ }
+ static const Type Double() {
+ return Type(Type::PRIMITIVE, "double");
+ }
+ static const Type Boolean() {
+ return Type(Type::PRIMITIVE, "boolean");
+ }
+ static const Type Void() {
+ // For simplicity, we consider 'void' as a primitive type, like the Java
+ // Reflection API does
+ return Type(Type::PRIMITIVE, "void");
+ }
+ static Type Class(const string& name, const string& package = "") {
+ return Type(Type::CLASS, name, package);
+ }
+ static Type Interface(const string& name, const string& package = "") {
+ return Type(Type::INTERFACE, name, package);
+ }
+ static Type Enum(const string& name, const string& package = "") {
+ return Type(Type::ENUM, name, package);
+ }
+ static Type Generic(const string& name = "") {
+ return Type(Type::GENERIC, name);
+ }
+ static Type ClassOf(const Type& type) {
+ return Class("Class").add_parameter(type);
+ }
+ static Type ListOf(const Type& type) {
+ return Interface("List", "java.util").add_parameter(type);
+ }
+ static Type IterableOf(const Type& type) {
+ return Interface("Iterable").add_parameter(type);
+ }
+ const Kind& kind() const { return kind_; }
+ const string& name() const { return name_; }
+ const string& package() const { return package_; }
+ const string& description() const { return description_; }
+ Type& description(const string& description) {
+ description_ = description;
+ return *this;
+ }
+ const std::vector<Type>& parameters() const { return parameters_; }
+ Type& add_parameter(const Type& parameter) {
+ parameters_.push_back(parameter);
+ return *this;
+ }
+ const std::vector<Annotation>& annotations() const { return annotations_; }
+ Type& add_annotation(const Annotation& annotation) {
+ annotations_.push_back(annotation);
+ return *this;
+ }
+ const std::deque<Type>& supertypes() const { return supertypes_; }
+ Type& add_supertype(const Type& type) {
+ if (type.kind_ == CLASS) {
+ supertypes_.push_front(type); // keep superclass at the front of the list
+ } else if (type.kind_ == INTERFACE) {
+ supertypes_.push_back(type);
+ }
+ return *this;
+ }
+ // Returns true if "type" is of a known collection type (only a few for now)
+ bool IsCollection() const {
+ return name_ == "List" || name_ == "Iterable";
+ }
+ // Returns true if this instance is a wildcard (<?>)
+ bool IsWildcard() const {
+ return kind_ == GENERIC && name_.empty();
+ }
+
+ protected:
+ Type(Kind kind, const string& name, const string& package = "")
+ : kind_(kind), name_(name), package_(package) {}
+
+ private:
+ Kind kind_;
+ string name_;
+ string package_;
+ string description_;
+ std::vector<Type> parameters_;
+ std::vector<Annotation> annotations_;
+ std::deque<Type> supertypes_;
+};
+
+// Definition of a Java annotation
+//
+// This class only defines the usage of an annotation in a specific context,
+// giving optionally a set of attributes to initialize.
+class Annotation : public Type {
+ public:
+ static Annotation Create(const string& type_name, const string& pkg = "") {
+ return Annotation(type_name, pkg);
+ }
+ const string& attributes() const { return attributes_; }
+ Annotation& attributes(const string& attributes) {
+ attributes_ = attributes;
+ return *this;
+ }
+
+ private:
+ string attributes_;
+
+ Annotation(const string& name, const string& package)
+ : Type(Kind::ANNOTATION, name, package) {}
+};
+
+// A definition of a Java variable
+//
+// This class declares an instance of a type, such as a class field or a
+// method argument, which can be documented.
+class Variable {
+ public:
+ static Variable Create(const string& name, const Type& type) {
+ return Variable(name, type, false);
+ }
+ static Variable Varargs(const string& name, const Type& type) {
+ return Variable(name, type, true);
+ }
+ const string& name() const { return name_; }
+ const Type& type() const { return type_; }
+ bool variadic() const { return variadic_; }
+ const string& description() const { return description_; }
+ Variable& description(const string& description) {
+ description_ = description;
+ return *this;
+ }
+ private:
+ string name_;
+ Type type_;
+ bool variadic_;
+ string description_;
+
+ Variable(const string& name, const Type& type, bool variadic)
+ : name_(name), type_(type), variadic_(variadic) {}
+};
+
+// A definition of a Java class method
+//
+// This class defines the signature of a method, including its name, return
+// type and arguments.
+class Method {
+ public:
+ static Method Create(const string& name, const Type& return_type) {
+ return Method(name, return_type, false);
+ }
+ static Method ConstructorFor(const Type& clazz) {
+ return Method(clazz.name(), clazz, true);
+ }
+ bool constructor() const { return constructor_; }
+ const string& name() const { return name_; }
+ const Type& return_type() const { return return_type_; }
+ const string& description() const { return description_; }
+ Method& description(const string& description) {
+ description_ = description;
+ return *this;
+ }
+ const string& return_description() const { return return_description_; }
+ Method& return_description(const string& description) {
+ return_description_ = description;
+ return *this;
+ }
+ const std::vector<Variable>& arguments() const { return arguments_; }
+ Method& add_arguments(const std::vector<Variable>& args) {
+ arguments_.insert(arguments_.cend(), args.cbegin(), args.cend());
+ return *this;
+ }
+ Method& add_argument(const Variable& var) {
+ arguments_.push_back(var);
+ return *this;
+ }
+ const std::vector<Annotation>& annotations() const { return annotations_; }
+ Method& add_annotation(const Annotation& annotation) {
+ annotations_.push_back(annotation);
+ return *this;
+ }
+
+ private:
+ string name_;
+ Type return_type_;
+ bool constructor_;
+ string description_;
+ string return_description_;
+ std::vector<Variable> arguments_;
+ std::vector<Annotation> annotations_;
+
+ Method(const string& name, const Type& return_type, bool constructor)
+ : name_(name), return_type_(return_type), constructor_(constructor) {}
+};
+
+// A piece of code to read from a file.
+class Snippet {
+ public:
+ static Snippet Create(const string& fname, Env* env = Env::Default()) {
+ return Snippet(fname, env);
+ }
+ const string& data() const { return data_; }
+
+ private:
+ string data_;
+
+ Snippet(const string& fname, Env* env) {
+ TF_CHECK_OK(ReadFileToString(env, fname, &data_));
+ }
+};
+
+} // namespace java
+} // namespace tensorflow
+
+#endif // TENSORFLOW_JAVA_SRC_GEN_CC_JAVA_DEFS_H_