Можно ли применить функцию к коллекции с помощью Java Guava?

Я хочу применить функцию к коллекции, карте и т.д., используя Guava.

В основном, мне нужно изменить размер строк и столбцов таблицы по отдельности, чтобы все строки и столбцы были одинакового размера, делая что-то подобное:

    Table<Integer, Integer, Cell> table = HashBasedTable.create();
    Maps.transformValues(table.columnMap(), new ResizeFunction(BlockDimension.WIDTH));
    Maps.transformValues(table.rowMap(), new ResizeFunction(BlockDimension.HEIGHT));

public interface Cell {
    int getSize(BlockDimension dimension);
    void setSize(BlockDimension dimension);
}

У меня уже есть представление о том, каким должен быть ResityFunction . Однако необходимо применить , а не просто вернуть коллекцию .

-121--1426391- Как записать самодифицирующийся код в C? Я хочу написать фрагмент кода, который постоянно изменяется, даже если изменение незначительное. Например, может быть что-то вроде для i в 1 к 100, начать x: = 200 для j в 200...

Я хочу написать кусок кода, который постоянно меняется, даже если изменение незначительное.

Например, может быть что-то вроде

 для i в 1 к 100, сделать
начать
x: = 200
для j в 200 вниз до 1, сделать
начать
сделать что-то
конец
конец

Предположим, что мой код должен после первой итерации изменить строку x: = 200 на другую строку x: = 199 , а затем после следующей итерации изменить ее на x: = 198 и так далее.

Возможно ли написание такого кода? Нужно ли для этого использовать встроенную сборку?

ПРАВКА: Вот почему я хочу сделать это в C:

Эта программа будет запущена на экспериментальной операционной системе, и я не могу/не знаю, как использовать программы, скомпилированные с других языков. Настоящая причина, по которой мне нужен такой код, заключается в том, что этот код выполняется на гостевой операционной системе виртуальной машины. Гипервизор является бинарным транслятором, который переводит порции кода. Переводчик выполняет некоторые оптимизации. Он переводит фрагменты кода только один раз. В следующий раз, когда тот же самый блок будет использован гостем, переводчик будет использовать ранее переведенный результат. Теперь, если код изменяется на лету, то переводчик замечает это и помечает свой предыдущий перевод как устаревший. Таким образом, принудительный повторный перевод того же кода. Это то, чего я хочу добиться, чтобы заставить переводчика делать много переводов. Обычно эти порции являются инструкциями между командами перехода (например, инструкциями перехода). Я просто думаю, что самодифицирующийся код будет фантастическим способом достичь этого.

27
задан AnkurVj 16 September 2011 в 15:50
поделиться

1 ответ

Извините, я отвечаю с небольшим опозданием, но я думаю, что нашел именно то, что вы ищете: https://shanetully.com/2013/12/writing-a-self-mutating-x86_64-c -program /

В этой статье они изменяют значение константы, вставляя сборку в стек. Затем они выполняют шелл-код, изменяя память функции в стеке.

Ниже приведен первый код:

#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/mman.h>

void foo(void);
int change_page_permissions_of_address(void *addr);

int main(void) {
    void *foo_addr = (void*)foo;

    // Change the permissions of the page that contains foo() to read, write, and execute
    // This assumes that foo() is fully contained by a single page
    if(change_page_permissions_of_address(foo_addr) == -1) {
        fprintf(stderr, "Error while changing page permissions of foo(): %s\n", strerror(errno));
        return 1;
    }

    // Call the unmodified foo()
    puts("Calling foo...");
    foo();

    // Change the immediate value in the addl instruction in foo() to 42
    unsigned char *instruction = (unsigned char*)foo_addr + 18;
    *instruction = 0x2A;

    // Call the modified foo()
    puts("Calling foo...");
    foo();

    return 0;
}

void foo(void) {
    int i=0;
    i++;
    printf("i: %d\n", i);
}

int change_page_permissions_of_address(void *addr) {
    // Move the pointer to the page boundary
    int page_size = getpagesize();
    addr -= (unsigned long)addr % page_size;

    if(mprotect(addr, page_size, PROT_READ | PROT_WRITE | PROT_EXEC) == -1) {
        return -1;
    }

    return 0;
}
9
ответ дан 28 November 2019 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: