crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


Сейчас на сайте человек: 118
(пользователей: 0, гостей: 118)
Google.com, Yandex.com

Перейти к месяцу

Январь 2021

  ПВСЧПСВ
»
1
2
3
»
4
5
6
7
8
10
»
11
12
14
15
16
17
»
18
19
21
23
»
27
28
29
30
31

> Последние обсуждения
 
> Статический полиморфизм
Автор Litkevich Yuriy — 30.12.2020, 7:53 — 6 комментариев
Пытаюсь понять, как можно в С++ реализовать полиморфизм времени компиляции для следующей задачи.

Имеется шина 1-Wire (из названия понятно, что она однопроводная, несчитая общего проводника).
Имеется N устройств на этой шине.
Шина должна знать какие устройства на ней есть.
Устройства должны знать на какой шине сидят.
Устройства пользуются функциями-членами шины для выполнения своих задач.


class OneWireDevice;

class OneWire
{
    bool addDevice(OneWireDevice *device);
    bool removeDevice(OneWireDevice *device);
    
    List<OneWireDevice *> deviceList(); // List - предполагаемый шаблонный контейнерный класс
    
    void foo();
}

class OneWireDevice
{
    OneWireDevice(OneWire *awire = 0);
    
    OneWire* wire();
    
    void bar()
    {
        wire()->foo();
    }
}



Особенность 1-Wire:
1) может быть реализована програмным дрыганьем ножки микроконтроллера;
2) может быть реализована через аппаратный UART, т.е. передавая определённый байт
огибающая сигнала будет повторять необходимую форму ипульсов 1-Wire.
3) сам UART можно реализовать программно дрыгая ножку микроконтроллера.

Т.о. возможны следующие схемы реализации 1-Wire:
OneWire(Pin);
OneWire(UART);
OneWire(SoftUART(Pin));

Сейчас у меня сделан абстрактный класс 1-Wire и наследники, реализующие один из 3-х способов.

class OneWire {...};

// -1-
class OneWirePin: public OneWire
{
    OneWirePin(Pin *pin);
};

//...
Pin *pin = new Pin();
OneWirePin *wire(pin);    


// -2-
class OneWireUart: public OneWire
{
    OneWireUart(Uart *uart);
};

//...
Uart *uart = new Uart();
OneWirePin *wire(uart);

// -3-
class OneWireUartPin: public OneWire
{
    OneWireUartPin(SoftUart *uart)
};

//...
Pin *pin = new Pin();
SoftUart *uart = new SoftUart(pin);
OneWirePin *wire(uart);



// ======================================

Всё бы хорошо, но наличие виртуальных функций для микроконтроллерного применения - плохо.
это замедляет код и раздувает его из-за vtable. Сначала хотел реализовать OneWire на шаблонах.

Однако споткнулся на том, что класс OneWireDevice должен пользоваться OneWire и, в частности, возвращать OneWire.
т.е. сделать сам OneWire шаблонным не получится, т.к. для метода OneWireDevice::wire() надо будет аргумент шаблона указывать.

Может кому-то подобную иерархию со статическим полиморфизмом доводилось реализовывать?


В идеале хотелось бы получить такой код применения:
// -1-
Pin *pin = new Pin();
OneWire *wire = new OneWire<Pin *>(pin);

// или

Pin pin;
OneWire *wire = new OneWire<Pin>(pin);


// -2-
UART *uart = new Uart();
OneWire *wire = new OneWire<UART *>(uart);

// или

UART uart;
OneWire *wire = new OneWire<UART >(uart );


// -3-
SoftUART *uart = new SoftUART();
OneWire *wire = new OneWire<SoftUART *>(uart);

// или

SoftUART uart;
OneWire *wire = new OneWire<SoftUART>(uart );
Просмотров: 181, последний комментарий от Алексей1153   

> Cosmopolitan
Автор Iron Bug — 29.12.2020, 1:45 — 2 комментариев
смотрите, какая красота:

Cosmopolitan - стандартаная Си-библиотека и формат кроссплатформенных исполняемых файлов
Цитата
Доступен первый выпуск проекта Cosmopolitan, развивающего стандартную Си-библиотеку и универсальный формат исполняемых файлов, который можно использовать для распространения программ для разных операционных систем. Получаемый при статическом связывании с предложенными libc и runtime файл пригоден для исполнения в любом дистрибутиве Linux, macOS, Windows, FreeBSD и OpenBSD. Код проекта распространяется под лицензией ISC (упрощённый вариант MIT/BSD).

Контейнер для формирования универсальных исполняемых файлов основан на совмещении специфичных для разных операционных систем сегментов и заголовков (PE, ELF, MACHO, OPENBSD) в одном файле. Для обеспечения запуска одного исполняемого файла в Windows и Unix-системах применяется трюк, суть которого в кодировании файлов Windows PE в виде shell-скрипта, пользуясь тем, что Thompson Shell не использует маркер скриптов "#!". В итоге создаётся исполняемый файл, в котором скомбинировано несколько разных форматов, используемых в Unix, Windows и macOS.:

https://www.opennet.ru/opennews/art.shtml?num=54325

идея мне очень нравится. думаю даже потыкать палочкой на досуге.
Просмотров: 144, последний комментарий от Iron Bug   

RSS Текстовая версия Сейчас: 22.1.2021, 0:38