-
EgorovAlex © (30.03.12 11:49) [0]Здравствуйте,
Есть класс - читатель файлов, примерная схема:
TCustomMappedStream = class(TStream)
private
<внутренности>
public
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(const Offset: Int64; Origin:TSeekOrigin): Int64; override;
end;
Он целиком создан и работоспособен для little-endian файлов
Теперь хочется его адаптировать и для big-endian файлов, чтобы был универсален, но и не хочется терять производительность
Как я сделал сейчас:
добавил public property Swapped: Boolean
в Read добавился код:
begin
<старый код>;
if Swapped then
<переворачиваем данные>;
end;
Этот код работоспособен, но не оптимален, на мой взгляд, т.к. для каждой операции чтения производится проверка Swapped.
Как хотелось бы в теории: есть две приватные функции - прямого и обратного чтения и есть паблик функция указатель на одну из этих функций, при изменении Swapped переменной меняем указатель на функцию и далее всё работает без постоянной проверки Swapped.
Возможно ли такое реализовать и как? -
brother © (30.03.12 11:57) [1]> big-endian и little-endian
что это? -
EgorovAlex © (30.03.12 12:02) [2]прямой и обратный порядок байт в файле
http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D1%8F%D0%B4%D0%BE%D0%BA_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2 -
han_malign (30.03.12 13:19) [3]
> Возможно ли такое реализовать и как?
- а ты уверен, что косвенный вызов быстрее чем элементарное ветвление???
T(CustomMapped)Stream - семантически не должен производит никаких трансформаций данных - этим должен заниматься более высокий слой реализации...
И файлы не бывают ни остроконечными, ни тупоконечными - т.к. по определению - это именованная последовательность данных. А абстракция этих данных - никакого отношения собственно к файлам уже не имеет... -
EgorovAlex © (30.03.12 13:24) [4]Ну у меня уже есть рабочий вариант, который указал тут, вопрос так и стоит - можно ли оптимальнее, понятно, что это можно и в потомке этого класса сделать, вопрос про оптимальность стоит
-
MBo © (30.03.12 16:00) [5]>Возможно ли такое реализовать и как?
Да, возможно, пример:
http://www.delphimaster.ru/articles/pixels/index.html
Часть "Методы доступа к значению цвета в указанной точке"
Однако нужно ли?
Проверка if Swapped - вряд ли будет причиной медленной работы... -
>
> Возможно ли такое реализовать и как?
Как то так:
TSwappedStream = class(TStream)
protected
FStream: TStream;
FOwnsStream: Boolean;
protected
procedure Swap(const Buffer; Len: integer);
public
constructor Create(AStream: TStream; AOwnsStream: Boolean = False);
destructor Destroy; override;
function Read(var Buffer; Count: Integer): Longint; override;
function Write(const Buffer; Count: Integer): Longint; override;
property Stream: TStream read FStream;
end;
В Read и Write переворачивай буфер Swap():
function THexTextStream.Read(var Buffer; Count: Integer): Longint;
begin
result := FStream.Read(Buffer, Count);
Swap(Buffer, Count);
end; -
Германн © (31.03.12 02:00) [7]
> Есть класс - читатель файлов
> Он целиком создан и работоспособен для little-endian файлов
А что это за файлы такие?
P.S. Пожалуйста не повторяйте в ответ вашу ссылку на вики. Меня интересует именно именно тип файлов. И для чего они нужны?
P.P.S.
Пример MBO конечно рассматривает "нечто подобное". Но у меня нет никакой уверенности, что сей пример вам поможет. Ибо в нём рассматривается работа с весьма конкретными файлами. -
EgorovAlex © (02.04.12 08:42) [8]Да я уже отказался от своей идеи, проще с ручной проверкой, тем более там можно блоками проверять и читать, а не каждый раз, но информацию полезную почерпнул, спасибо
А файлы - это файлы спулера печати, там информация представлена как правило с самом разнообразном виде: тектовый, бинарный и совместный