Вопрос с ответом на себя, на всякий случай он может быть полезен любому:
Это довольно странная ситуация, связанная с драйвером codeigniter mysqli class CI_DB_mysqli_driver
в system\database\drivers\mysqli\mysqli_driver.php
. По какой-то причине код в
if (isset($this->stricton)) { /* ... */ }
... устанавливает некоторые параметры mysqli MYSQLI_INIT_COMMAND, которые вызывают ошибку.
Легко обойти ошибку , не устанавливая флаг 'stricton'
в настройках вашей дБ. Просто закомментируйте это:
$db['default'] = array(
'dsn' => '',
'hostname' => '127.0.0.1',
'username' => 'my_username',
'password' => 'my_password',
'database' => 'my_db',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
// 'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
То, что Вы ищете, называют стопкой уволенного. AFAIK, BCL не содержит один, хотя они тривиальны для реализации. Обычно функциональность Отмены и Восстановления полагается на такие структуры данных.
Они - в основном массив, и когда Вы продвигаете на стек, 'вершина' стека перемещает массив. В конечном счете вершина перенесется назад к началу, когда стек будет полон, и замените 'нижнюю часть' стека.
Google не обеспечил много информации о нем. Это является лучшим, я мог найти:
(Предупреждение PDF) http://courses.cs.vt.edu/~cs2704/spring04/projects/DropOutStack.pdf
Вот некоторый шаблонный код, для запущения Вас. Я позволю Вам заполнить остальных (проверка исправности, количество, индексатор, и т.д.)
class DropOutStack<T>
{
private T[] items;
private int top = 0;
public DropOutStack(int capacity)
{
items = new T[capacity];
}
public void Push(T item)
{
items[top] = item;
top = (top + 1) % items.Length;
}
public T Pop()
{
top = (items.Length + top - 1) % items.Length;
return items[top];
}
}
Вы на самом деле смотрите на что-то подобное реализации циклического списка. Существует реализация LimitedQueue, сделанная PIEBALDconsult в CodeProject. Это подобно Вашему требованию. Просто необходимо перенести Стек вместо Очереди, как сделано автором. Плюс автор также реализовал индексатор, который удобен, если необходимо получить доступ к чему-либо еще кроме главного стека (для показа списка отмены, возможно).
Править: Реализация автора также генерирует событие, когда последнее (сначала, зависит от того, является ли это очередью, или стек) удаляется, так, чтобы можно было знать, когда что-то выбрасывается.
Я полагаю, что Вы ищете (возможно измененную) двухстороннюю очередь - структура данных, которая предоставляет доступ от любого конца.
Я не вижу путь. Можно наследоваться Stack<T>
, но, кажется, нет ничего полезного для переопределения.
Легкое (если немного утомительный) путь должно было бы перенестись Stack<T>
в Вашем собственном, скажем, LimitedStack<T>
. Затем реализуйте методы, которые Вы хотите и передаете до внутреннего Stack<T>
, в то время как включая Вашу ограничивающую логику в Push
метод и везде, где еще Вам нужен он.
Это - боль, чтобы записать всем тем участникам передачи, особенно если Вы реализуете весь одинаковый интерфейсы как Stack<T>
... но с другой стороны, только необходимо сделать это однажды, и затем это сделано.