Skip to content

Commit

Permalink
1. Исправление замечаний кролика
Browse files Browse the repository at this point in the history
2. Исправлена ошибка с порядком приоритетной очереди
3. Синхронизированная очередь так же теперь поддерживает ожидание на взятии элемента
  • Loading branch information
sfaqer committed Dec 17, 2024
1 parent 167ea78 commit 46eac4a
Show file tree
Hide file tree
Showing 8 changed files with 140 additions and 70 deletions.
2 changes: 1 addition & 1 deletion doc/Списки/Список.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@
//
// Параметры:
// Индекс - Число - Индекс устанавливаемого элемента
// Значение -Произвольный - Устанавливаемый элемент
// Значение - Произвольный - Устанавливаемый элемент
//
// Возвращаемое значение:
// Произвольный - Значение которое было заменено
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
Функция ПроцессорКоллекции() Экспорт
Возврат Очередь.ПроцессорКоллекции();
КонецФункции

Функция Количество() Экспорт
Возврат Очередь.Количество();
КонецФункции
Expand Down Expand Up @@ -71,7 +71,7 @@
Блокировка.Разблокировать();

Исключение

Блокировка.Разблокировать();
ВызватьИсключение;

Expand Down Expand Up @@ -108,7 +108,7 @@
КонецЕсли;

_ = Новый РефлекторОбъекта(Элемент) // BSLLS:UnusedLocalVariable-off
.РеализуетИнтерфейс(ИнтерфейсОтложенный, Истина);
.РеализуетИнтерфейс(ИнтерфейсОтложенный, Истина);
Возврат Очередь.Положить(Элемент);

КонецФункции
Expand All @@ -131,24 +131,24 @@
КонецЕсли;

Исключение

Блокировка.Разблокировать();
ВызватьИсключение;

КонецПопытки;

Блокировка.Разблокировать();

Если ТекущаяУниверсальнаяДатаВМиллисекундах() >= Конец И Результат = Неопределено Тогда
Результат = Опциональные.Пустой();
КонецЕсли;

Если Результат <> Неопределено Тогда
Если Результат <> Неопределено Тогда
Возврат Результат;
КонецЕсли;

Приостановить(100);

КонецЦикла;

КонецФункции
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
Функция ПроцессорКоллекции() Экспорт
Возврат ПроцессорыКоллекций.ИзКоллекции(ВМассив());
КонецФункции

Функция Количество() Экспорт
Возврат Массив.Количество();
КонецФункции
Expand Down Expand Up @@ -108,7 +108,7 @@
КонецПроцедуры

Функция Удалить(Элемент) Экспорт

Индекс = Массив.Найти(Элемент);

Если Индекс <> Неопределено Тогда
Expand All @@ -117,7 +117,7 @@
ОповеститьОбИзмененииКоллекции();

Возврат Истина;

КонецЕсли;

Возврат Ложь;
Expand Down Expand Up @@ -156,7 +156,7 @@
Пока Итератор.ЕстьСледующий() Цикл

Если Предикат.Выполнить(Итератор.Следующий()) Тогда

Итератор.Удалить();

БылУдаленХотяБыОдинЭлемент = Истина;
Expand All @@ -178,7 +178,7 @@
Пока Итератор.ЕстьСледующий() Цикл

Если Не Коллекция.Содержит(Итератор.Следующий()) Тогда

Итератор.Удалить();

БылУдаленХотяБыОдинЭлемент = Истина;
Expand All @@ -200,8 +200,8 @@
Добавлен = Ложь;

Для Индекс = 0 По Массив.ВГраница() Цикл
Если Компаратор.Выполнить(Массив[Индекс], Элемент) < 0 Тогда

Если Компаратор.Выполнить(Массив[Индекс], Элемент) > 0 Тогда
Массив.Вставить(Индекс, Элемент);
Добавлен = Истина;
Прервать;
Expand All @@ -222,21 +222,21 @@
Функция Взять() Экспорт

Если Количество() > 0 Тогда

Элемент = Массив[0];
Массив.Удалить(0);
ОповеститьОбИзмененииКоллекции();

Возврат Новый Опциональный(Элемент);

КонецЕсли;

Возврат Опциональные.Пустой();

КонецФункции

Процедура ОповеститьОбИзмененииКоллекции()

Если ЕстьИтераторы Тогда
ВызватьСобытие("КоллекцияМодифицирована", Новый Массив);
КонецЕсли;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,28 +255,41 @@
Блокировка.Разблокировать();
ВызватьИсключение;
КонецПопытки;

Блокировка.Разблокировать();

Возврат Результат;

КонецФункции

Функция Взять() Экспорт
Функция Взять(Таймаут = 0) Экспорт

Блокировка.Заблокировать();
Конец = ТекущаяУниверсальнаяДатаВМиллисекундах() + Таймаут;
Результат = Неопределено;

Пока Истина Цикл

Блокировка.Заблокировать();

Попытка
Результат = ВнутренняяОчередь.Взять();
Исключение
Блокировка.Разблокировать();
ВызватьИсключение;
КонецПопытки;

Попытка
Результат = ВнутренняяОчередь.Взять();
Исключение
Блокировка.Разблокировать();
ВызватьИсключение;
КонецПопытки;

Блокировка.Разблокировать();

Возврат Результат;

ВремяВышло = ТекущаяУниверсальнаяДатаВМиллисекундах() >= Конец;

Если Результат.СодержитЗначение() Или ВремяВышло Тогда
Возврат Результат;
КонецЕсли;

Приостановить(100);

КонецЦикла;

КонецФункции

Процедура ОбработкаПолученияПредставления(Представление, СтандартнаяОбработка) // BSLLS:UnusedLocalMethod-off
Expand All @@ -290,7 +303,7 @@
&Обходимое
&Реализует("Очередь")
Процедура ПриСозданииОбъекта(Очередь)

ВнутренняяОчередь = Очередь;
Блокировка = Новый БлокировкаРесурса(ЭтотОбъект);

Expand Down
8 changes: 4 additions & 4 deletions tests/Массивы.os
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@

&Тест
Процедура ИзЭлементов() Экспорт

// Когда

Результат = Массивы.ИзЭлементов(
Expand All @@ -94,9 +94,9 @@
.ИмеетДлину(10);

Для Сч = 1 По 9 Цикл

Ожидаем.Что(Результат.Найти(Сч)).Не_().ЭтоНеопределено();

Ожидаем.Что(Результат[Сч - 1]).Равно(Сч);
КонецЦикла;

Ожидаем.Что(Результат[9]).Равно(9);

КонецПроцедуры
58 changes: 29 additions & 29 deletions tests/ПриоритетнаяОчередь.os
Original file line number Diff line number Diff line change
Expand Up @@ -389,9 +389,9 @@
// Дано

Массив = Новый Массив;
Массив.Добавить(3);
Массив.Добавить(2);
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(5);

ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь;

Expand All @@ -410,10 +410,10 @@
Ожидаем.Что(Результат).ЭтоИстина();

Ожидаем.Что(Массив).ИмеетДлину(4);
Ожидаем.Что(Массив[0]).Равно(4);
Ожидаем.Что(Массив[1]).Равно(3);
Ожидаем.Что(Массив[2]).Равно(2);
Ожидаем.Что(Массив[3]).Равно(1);
Ожидаем.Что(Массив[0]).Равно(1);
Ожидаем.Что(Массив[1]).Равно(2);
Ожидаем.Что(Массив[2]).Равно(4);
Ожидаем.Что(Массив[3]).Равно(5);

КонецПроцедуры

Expand All @@ -423,9 +423,9 @@
// Дано

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(4);
Массив.Добавить(1);
Массив.Добавить(3);

ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь(КомпараторДействие());

Expand All @@ -436,16 +436,16 @@
);

// Когда
Результат = ПриоритетнаяОчередь.Добавить(3);
Результат = ПриоритетнаяОчередь.Добавить(4);

// Тогда
Ожидаем.Что(Результат).ЭтоИстина();

Ожидаем.Что(Массив).ИмеетДлину(4);
Ожидаем.Что(Массив[0]).Равно(1);
Ожидаем.Что(Массив[1]).Равно(3);
Ожидаем.Что(Массив[2]).Равно(2);
Ожидаем.Что(Массив[3]).Равно(4);
Ожидаем.Что(Массив[0]).Равно(2);
Ожидаем.Что(Массив[1]).Равно(4);
Ожидаем.Что(Массив[2]).Равно(1);
Ожидаем.Что(Массив[3]).Равно(3);

КонецПроцедуры

Expand Down Expand Up @@ -487,9 +487,9 @@
Массив = Рефлектор.ПолучитьСвойство(ПриоритетнаяОчередь, "Массив");

Ожидаем.Что(Массив).ИмеетДлину(3);
Ожидаем.Что(Массив[0]).Равно(3);
Ожидаем.Что(Массив[0]).Равно(1);
Ожидаем.Что(Массив[1]).Равно(2);
Ожидаем.Что(Массив[2]).Равно(1);
Ожидаем.Что(Массив[2]).Равно(3);

КонецПроцедуры

Expand Down Expand Up @@ -1034,9 +1034,9 @@
// Дано

Массив = Новый Массив;
Массив.Добавить(3);
Массив.Добавить(2);
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(4);

ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь;

Expand All @@ -1048,17 +1048,17 @@

// Когда

Результат = ПриоритетнаяОчередь.Положить(4);
Результат = ПриоритетнаяОчередь.Положить(3);

// Тогда

Ожидаем.Что(Результат).ЭтоИстина();

Ожидаем.Что(Массив).ИмеетДлину(4);
Ожидаем.Что(Массив[0]).Равно(4);
Ожидаем.Что(Массив[1]).Равно(3);
Ожидаем.Что(Массив[2]).Равно(2);
Ожидаем.Что(Массив[3]).Равно(1);
Ожидаем.Что(Массив[0]).Равно(1);
Ожидаем.Что(Массив[1]).Равно(2);
Ожидаем.Что(Массив[2]).Равно(3);
Ожидаем.Что(Массив[3]).Равно(4);

КонецПроцедуры

Expand Down Expand Up @@ -1086,9 +1086,9 @@
// Дано

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(2);
Массив.Добавить(1);

ПриоритетнаяОчередь = Новый ПриоритетнаяОчередь(СравнениеЗначений.ОбратныйПорядок());

Expand All @@ -1106,11 +1106,11 @@

Ожидаем.Что(Результат).ИмеетТип("Опциональный");
Ожидаем.Что(Результат.Пустой()).ЭтоЛожь();
Ожидаем.Что(Результат.Получить()).Равно(1);
Ожидаем.Что(Результат.Получить()).Равно(3);

Ожидаем.Что(Массив).ИмеетДлину(2);
Ожидаем.Что(Массив[0]).Равно(2);
Ожидаем.Что(Массив[1]).Равно(3);
Ожидаем.Что(Массив[1]).Равно(1);

КонецПроцедуры

Expand All @@ -1128,14 +1128,14 @@
КонецПроцедуры

Функция Компаратор(Первый, Второй) Экспорт

Если Первый % 2 > Второй % 2 Тогда
Возврат 1;
ИначеЕсли Первый % 2 = Второй % 2 Тогда
Возврат 0;
Иначе
Возврат -1;
КонецЕсли;
КонецЕсли;

КонецФункции

Expand Down
Loading

0 comments on commit 46eac4a

Please sign in to comment.