- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
public static Rectangle2D fit(final Rectangle2D in, final Rectangle2D out) {
final Rectangle2D.Double fit = new Rectangle2D.Double();
if (in.getWidth() > in.getHeight()) {
fit.width = out.getWidth();
fit.height = (out.getHeight() * in.getHeight()) / in.getWidth();
fit.x = out.getX();
fit.y = out.getY() + ((out.getHeight() - fit.height) / 2);
} else {
fit.width = (out.getWidth() * in.getWidth()) / in.getHeight();
fit.height = out.getHeight();
fit.x = out.getX() + ((out.getWidth() - fit.width) / 2);
fit.y = out.getY();
}
// if ((in.getWidth() / in.getHeight()) != (fit.width / fit.height)) {
// throw new RuntimeException();
// }
// if (!fit.contains(fit)) {
// throw new RuntimeException();
// }
return fit;
}
Lure Of Chaos 27.06.2013 13:11 # +2
# 17: // if (!out.contains(fit)) {
bormand 27.06.2013 13:26 # +4
someone 27.06.2013 14:57 # +4
inkanus-gray 27.06.2013 15:15 # +1
Lure Of Chaos 27.06.2013 15:18 # +3
3.14159265 27.06.2013 16:17 # +1
в жабе есть assert который никогда не работает.
bormand 27.06.2013 16:30 # 0
Почему?
3.14159265 27.06.2013 16:51 # 0
someone 28.06.2013 07:46 # +1
Потому и не использую.
bormand 28.06.2013 08:39 # +1
someone 28.06.2013 13:29 # −2
То же самое в современных Си-компиляторах. #ifdef нужен был в доисторические времена, когда компиляторы были тупыми.
roman-kashitsyn 28.06.2013 13:40 # +1
Lure Of Chaos 28.06.2013 13:43 # 0
roman-kashitsyn 28.06.2013 13:45 # 0
someone 28.06.2013 13:45 # −1
Если это приложение - вы уж или используйте Guava, или нет. Если это библиотека - добавляйте Guava как жёсткую зависимость, да и всё.
Кстати, конкретно эта задача решается вообще просто:
roman-kashitsyn 28.06.2013 13:49 # +1
someone 28.06.2013 13:54 # −2
Не хотите делать для каждого класса подкласс - сделайте статический метод, который будет возвращать реализацию интерфейса через duck typing и reflection.
roman-kashitsyn 28.06.2013 14:09 # +1
Поможет только наличие стандартных функций (и проектирование библиотек с использованием таких функций), или, на крайняк, имплиситы из скалы.
bormand 28.06.2013 14:03 # −1
roman-kashitsyn 28.06.2013 14:06 # −1
anonimb84a2f6fd141 28.06.2013 14:32 # −1
Та блядь, написал ответ - а сайт с эксептом свалился.
Lure Of Chaos 28.06.2013 14:54 # 0
anonimb84a2f6fd141 28.06.2013 15:12 # −2
Lure Of Chaos 28.06.2013 15:15 # +2
anonimb84a2f6fd141 28.06.2013 15:38 # −2
roman-kashitsyn 28.06.2013 15:19 # 0
Процессоры compile-time аннотаций тоже не имеют отношения к препроцессору, ибо работают на уровне деклараций, а не токенов, это совершенно другой уровень. Например, нельзя изменить синтаксис языка.
Lure Of Chaos 28.06.2013 15:24 # +1
насколько я помню, в сишке препроцессор работает на уровне исходного текста по принципу "найти и заменить", еще до лексического разбора - так что еще токенов там нет
roman-kashitsyn 28.06.2013 15:29 # −1
Lure Of Chaos 28.06.2013 15:44 # −1
defecate-plusplus 29.06.2013 10:35 # +2
препроцессор для макроса со скобками должен проверить, что это действительно макрос со скобками (отличить max(... от _max(... и от (max)(... ), проверить число аргументов, вызвать макросы в новом тексте и т.д.
так что простейший разбор на токены там есть
anonimb84a2f6fd141 28.06.2013 15:38 # −1
Это важно?
roman-kashitsyn 28.06.2013 15:42 # 0
Понимаешь разницей между обработкой абстрактного сферического текста ПЕРЕД вызовом компилятора и обработкой языковой структуры, СОЗДАННОЙ компилятором?
Lure Of Chaos 28.06.2013 15:47 # −1
anonimb84a2f6fd141 28.06.2013 16:26 # 0
roman-kashitsyn 28.06.2013 17:04 # −1
anonimb84a2f6fd141 28.06.2013 23:30 # −1
defecate-plusplus 28.06.2013 23:33 # +1
anonimb84a2f6fd141 29.06.2013 04:15 # −1
bormand 29.06.2013 07:10 # 0
Аннотации сами по себе - нет. Это просто заметки, пристегнутые к соответствующим точкам кода.
А вот annotation processor, подключенный к компилятору, уже может сделать все что угодно - и генерацию, и дегенерацию, и перехуяцию.
Ну и в рантайме можно почитать эти аннотации, и воспользоваться ими в своих грязных целях.
defecate-plusplus 29.06.2013 10:37 # −1
это можно сделать аннотациями?
bormand 29.06.2013 12:08 # −1
Если честно - а хрен бы знал. Сейчас покопался в доках - получается, что annotation processor'ы сами по себе не были предназначены для модификации кода, а должны генерить что-то новое - конфиги, новые классы, которые потом будут загружены и.т.п...
Но, как показали некоторые найденные примеры (из-за которых я по глупости и поверил во всесильность процессоров), если перейти на темную сторону заюзав внутреннее API javac'а - com.sun.tools.javac.tree, то можно перепиливать даже код внутри методов.
http://www.docjar.com/docs/api/com/sun/tools/javac/tree/JCTree$JCClassDecl.html
Скорее всего будет достаточно добавить нужный интерфейс в список implementing. Но я совершенно в этом не уверен ;(
roman-kashitsyn 29.06.2013 12:28 # −1
bormand 29.06.2013 12:43 # −1
Хотел на OpenJDK потестить чорную магию с API javac'а, и обломался т.к. там нет нужных интерфейсов...
Lure Of Chaos 29.06.2013 12:40 # −1
можно модифицировать байт-код и сделать новый класс, и загрузить его новым класслоадером, тем же asm
bormand 29.06.2013 12:46 # −1
Зачем? Тут вроде речь шла о compile-time преобразованиях...
Lure Of Chaos 29.06.2013 12:51 # −1
roman-kashitsyn 29.06.2013 14:25 # −1
roman-kashitsyn 28.06.2013 23:38 # +4
Кэп: подготавливать сорцы к встрече с создателем конпейлятором. Например, опцианально подключать поддержку библиотек, чтобы не тянуть ворох ненужных зависимостей.
> стоит ли это делать таким образом?
В 98% случаев нет. Толко рантайм и куча модулей, только хардкор.
roman-kashitsyn 28.06.2013 14:56 # +3
Stertor 13.07.2013 09:17 # 0
Lure Of Chaos 28.06.2013 13:42 # 0
TauSigma 01.07.2013 14:23 # 0
roman-kashitsyn 27.06.2013 15:29 # 0
anonimb84a2f6fd141 27.06.2013 17:00 # 0