Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package xyz.cofe.cxel.eval;
import xyz.cofe.cxel.EvalError;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* Передача аргумента в функцию
*/
public class ArgPass {
//region конструктор и клонирование
/**
* Конструктор по умолчанию
*/
protected ArgPass(){
}
/**
* Конструктор копирования
* @param sample образец для копирования
*/
public ArgPass( ArgPass sample ){
if( sample==null )throw new IllegalArgumentException( "sample==null" );
passable = sample.passable;
index = sample.index;
inputType = sample.inputType;
passedArgument = sample.passedArgument;
invarant = sample.invarant;
covariant = sample.covariant;
implicit = sample.implicit;
castLooseData = sample.castLooseData;
primitiveCast = sample.primitiveCast;
call = sample.call;
cacheable = sample.cacheable;
}
@SuppressWarnings("MethodDoesntCallSuperMethod")
public ArgPass clone(){
return new ArgPass(this);
}
/**
* Настройка экземпляра
* @param conf конфигурация
* @return self ссылка
*/
protected ArgPass configure( Consumer conf ){
if( conf!=null ){
conf.accept(this);
}
return this;
}
/**
* Клонирование и настройка клона
* @param conf конфигурация
* @return клон
*/
protected ArgPass cloneAndConf( Consumer conf ){
return clone().configure(conf);
}
//endregion
//region конструирование
/**
* Аргумент не может быть передан
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass unpassable( int idx, Class type, Object value ){
return new ArgPass().configure( c -> {
c.passable = false;
c.implicit = false;
c.covariant = false;
c.invarant = false;
c.inputType = type;
c.passedArgument = (i)->value;
c.index = idx;
});
}
/**
* Аргумент может быть передан без какиз либо преобрахований
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass invariant( int idx, Class type, Object value ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = false;
c.covariant = false;
c.invarant = true;
c.inputType = type;
c.passedArgument = (i)->value;
c.index = idx;
});
}
/**
* Аргумент может быть передан без какиз либо преобрахований
* @param idx индекс аргумента
* @param type входящий тип
* @param fnvalue значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass invariant( int idx, Class type, Function fnvalue ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = false;
c.covariant = false;
c.invarant = true;
c.inputType = type;
c.passedArgument = fnvalue;
c.index = idx;
});
}
/**
* Аргумент может быть передан с использованием коваринтного приведения типа
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass covar( int idx, Class type, Object value ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = false;
c.covariant = true;
c.invarant = false;
c.inputType = type;
c.passedArgument = (i)->value;
c.index = idx;
});
}
/**
* Аргумент может быть передан с использованием коваринтного приведения типа
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass covar( int idx, Class type, Function value ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = false;
c.covariant = true;
c.invarant = false;
c.inputType = type;
c.passedArgument = value;
c.index = idx;
});
}
/**
* Аргумент может быть передан с использованием неявного преобразования
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass implicit( int idx, Class type, Object value ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = true;
c.covariant = false;
c.invarant = false;
c.inputType = type;
c.passedArgument = (i)->value;
c.index = idx;
});
}
/**
* Аргумент может быть передан с использованием неявного преобразования
* @param idx индекс аргумента
* @param type входящий тип
* @param value значение аргумента
* @return Форма передачи аргмента
*/
public static ArgPass implicit( int idx, Class type, Function value ){
return new ArgPass().configure( c -> {
c.passable = true;
c.implicit = true;
c.covariant = false;
c.invarant = false;
c.inputType = type;
c.passedArgument = value;
c.index = idx;
});
}
//endregion
//region call : Call - объект вызова
protected Call call;
/**
* Возвращает объект вызова
* @return объект вызова
*/
public Call call(){ return call; }
/**
* Клонирует и указывает объект вызова
* @param ncall объект вызова
* @return клон
*/
public ArgPass call( Call ncall ){
return cloneAndConf( c->c.call = ncall );
}
/**
* Указывает объект вызова
* @param ncall объект вызова
* @return self ссылка
*/
public ArgPass setCall( Call ncall ){
call = ncall;
return this;
}
//endregion
/**
* Возвращает входное значение аргумента вызова.
* Равноценно вызову self.call().getInputArgs().get( self.index() ).
* @return входное значение
*/
public Object inputValue(){
Call call = this.call();
if( call==null )throw new EvalError("call object not defined");
List