Files
Upsilon/apps/code/accordion.h
Léa Saviot c543145aae [code] Optimized MenuController's script list scrolling speed.
To know if the AddScript row should be displayed, we need to compute the free
space size of the accordion, which is very slow. We thus memoized a bool
indicating if the AddScript row should be displayed.

Change-Id: Ia3891c0fc8df9b0b8bf2a9ad053be6dfc848c970
2017-11-17 14:05:23 +01:00

52 lines
2.1 KiB
C++

#ifndef ESCHER_ACCORDION_H
#define ESCHER_ACCORDION_H
/* Accordion sequentially stores null-terminated char buffers. It moves the free
* space at the end of a buffer if it will be edited. */
class Accordion {
public:
Accordion(char * buffer, int bufferSize);
int numberOfBuffers() { return m_numberOfBuffers; }
const char * bufferAtIndex(int index);
char * editableBufferAtIndex(int index);
int sizeOfEditableBufferAtIndex(int index);
/* sizeOfEditableBufferAtIndex appends the free space at the end of the buffer
* and returns the length of the buffer plus the free space, minus one free
* space char that we never edit in order to keep track of the position of the
* last edited buffer. */
bool appendBuffer(const char * buffer);
bool replaceBufferAtIndex(int index, const char * buffer);
void deleteBufferAtIndex(int index);
void deleteLastBuffer();
void deleteAll();
int freeSpaceSize();
private:
static constexpr char k_freeSpaceMarker = 0x01;
int startOfBufferAtIndex(int index);
int endOfBufferAtIndex(int index);
int startOfFreeSpace();
void cleanFreeSpace();
/* When a buffer is edited, there is garbage after the first null char of the
* buffer. cleanFreeSpace() declares the space after this null char as free,
* by marking it with the FreeSpaceMarker. Because we always keep at least one
* Free Space char out of the editable zone, cleanFreeSpace() just needs to
* put FreeSpaceMarkers after the first null char of the last edited Buffer,
* until the first FreeSpaceMarker char.
* WARNING: We have to call cleanFreeSpace() before any operation on m_history,
* otherwise m_history might contain garbage chars. */
void moveFreeSpaceAtPosition(int i);
void moveFreeSpaceAtEndOfBufferAtIndex(int index);
void moveFreeSpaceAtEndOfHistory();
int m_historySize;
char * m_history;
/* The m_history variable sequentially stores null-terminated char buffers.
* It also contains free space, which is marked with the FreeSpaceMarker. By
* construction, there is always at least one free byte, and the free space is
* always continuous. */
int m_numberOfBuffers;
int m_startOfLastEditedBuffer;
};
#endif