Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright (C) 2013 Samuel Halliday
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, either version 3 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see [http://www.gnu.org/licenses/].
  */
 package com.github.fommil.netlib.generator;
 
 
 import java.util.List;
 
 @Mojo(
     name = "native-jni",
     defaultPhase = .,
     requiresDependencyResolution = .
 )
 
   protected final STGroupFile jniTemplates = new STGroupFile("com/github/fommil/netlib/generator/netlib-jni.stg"'$''$');

  
The interface that we are implementing.
 
   @Parameter(required = true)
   protected String implementing;

  
C Header files to include
 
   protected List<Stringincludes;

  
Prepended to the native function name.
 
   protected String prefix = "";

  
Suffixed to the native function name.
 
   protected String suffix = "";

  
Prepended to the native function parameter list.
 
   protected String firstParam;
 
   protected String noFirstParam;
 
   protected boolean cblas_hack;
 
   protected boolean lapacke_hack;
 
   protected boolean fortran_hack;
 
   protected boolean extractChar;
 
   @Override
   protected String generate(List<Methodmethodsthrows Exception {
     ST t = .getInstanceOf("jni");
 
     if ( == null)
        = Lists.newArrayList();
 
     .add(.replace(".c"".h"));
     t.add("includes");
 
     List<Stringmembers = Lists.newArrayList();
     for (Method method : methods) {
       members.add(render(methodfalse));
      if (hasOffsets(method))
        members.add(render(methodtrue));
    }
    t.add("members"members);
    return t.render();
  }
  private String render(Method methodboolean offsets) {
    ST f = .getInstanceOf("function");
    f.add("returns"jType2C(method.getReturnType()));
    f.add("fqn", ( + "." + method.getName()).replace(".""_") + (offsets ? "_1offsets" : ""));
    f.add("name" + method.getName() + );
    List<Stringparams = getNetlibCParameterTypes(methodoffsets);
    List<Stringnames = getNetlibJavaParameterNames(methodoffsets);
    f.add("paramTypes"params);
    f.add("paramNames"names);
    f.add("params"getCMethodParams(methodoffsets));
    if (method.getReturnType() == .) {
      if ( && Iterables.getLast(names).equals("info")) {
        f.add("assignReturn""int returnValue = ");
      } else {
        f.add("assignReturn""");
      }
      f.add("return""");
    } else {
      f.add("assignReturn"jType2C(method.getReturnType()) + " returnValue = ");
      f.add("return""return returnValue;");
    }
    List<Stringinit = Lists.newArrayList();
    List<Stringclean = Lists.newArrayList();
    for (int i = 0; i < params.size(); i++) {
      String param = params.get(i);
      String name = names.get(i);
      ST before = .getInstanceOf(param + "_init");
      if ( && name.equals("info"))
        before = .getInstanceOf(param + "_info_init");
      if (before != null) {
        before.add("name"name);
        init.add(before.render());
      }
      ST after = .getInstanceOf(param + "_clean");
      if ( && name.equals("info"))
        after = .getInstanceOf(param + "_info_clean");
      if (after != null) {
        after.add("name"name);
        clean.add(after.render());
      }
    }
    Collections.reverse(clean);
    f.add("init"init);
    f.add("clean"clean);
    return f.render();
  }
  private List<StringgetNetlibCParameterTypes(Method methodboolean offsets) {
    final List<Stringtypes = Lists.newArrayList();
    iterateRelevantParameters(methodoffsetsnew ParameterCallback() {
      @Override
      public void process(int iClass<?> paramString nameString offsetName) {
        types.add(jType2C(param));
      }
    });
    return types;
  }
  private String jType2C(Class param) {
    if (param == .)
      return "void";
    if (param.isArray())
      return "j" + param.getComponentType().getSimpleName() + "Array";
    return "j" + param.getSimpleName().toLowerCase();
  }
  private List<StringgetCMethodParams(final Method methodfinal boolean offsets) {
    final LinkedList<Stringparams = Lists.newLinkedList();
    if ( != null && !method.getName().matches()) {
      params.add();
    }
    iterateRelevantParameters(methodfalsenew ParameterCallback() {
      @Override
      public void process(int iClass<?> paramString nameString offsetName) {
        if ( && name.equals("info"))
          return;
        if (param == Object.class)
          throw new UnsupportedOperationException(method + " " + param + " " + name);
        if (param == . || !param.isPrimitive()) {
          name = "jni_" + name;
          // NOTE: direct comparisons against StringW.class don't work as expected
          if (!param.getSimpleName().equals("StringW") && param.getSimpleName().endsWith("W")) {
            name = "&" + name;
          }
        }
        if (param == String.class) {
          if () {
            if (name.contains("trans"))
              name = "getCblasTrans(" + name + ")";
            else if (name.contains("uplo"))
              name = "getCblasUpLo(" + name + ")";
            else if (name.contains("side"))
              name = "getCblasSide(" + name + ")";
            else if (name.contains("diag"))
              name = "getCblasDiag(" + name + ")";
          }
        }
        if (! && param == String.class && )
          name = name + "[0]";
        if ( && param.isPrimitive())
          name = "&" + name;
        if (offsets & offsetName != null) {
          name = name + " + " + offsetName;
        }
        params.add(name);
      }
    });
    return params;
  }
New to GrepCode? Check out our FAQ X