mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-11 13:36:13 +03:00
Everywhere: "indexes" => "indices"
I've wasted a silly amount of time in the past fretting over which of these words to use. Let's just choose one and use it everywhere. :^)
This commit is contained in:
parent
7ae7170d61
commit
3d4afe7614
Notes:
sideshowbarker
2024-07-18 18:53:37 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/3d4afe7614b
@ -39,10 +39,10 @@ struct TypeWrapper {
|
|||||||
using Type = T;
|
using Type = T;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename List, typename F, unsigned... Indexes>
|
template<typename List, typename F, unsigned... Indices>
|
||||||
constexpr void for_each_type_impl(F&& f, IndexSequence<Indexes...>)
|
constexpr void for_each_type_impl(F&& f, IndexSequence<Indices...>)
|
||||||
{
|
{
|
||||||
(forward<F>(f)(TypeWrapper<typename List::template Type<Indexes>> {}), ...);
|
(forward<F>(f)(TypeWrapper<typename List::template Type<Indices>> {}), ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename List, typename F>
|
template<typename List, typename F>
|
||||||
@ -51,10 +51,10 @@ constexpr void for_each_type(F&& f)
|
|||||||
for_each_type_impl<List>(forward<F>(f), MakeIndexSequence<List::size> {});
|
for_each_type_impl<List>(forward<F>(f), MakeIndexSequence<List::size> {});
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListA, typename ListB, typename F, unsigned... Indexes>
|
template<typename ListA, typename ListB, typename F, unsigned... Indices>
|
||||||
constexpr void for_each_type_zipped_impl(F&& f, IndexSequence<Indexes...>)
|
constexpr void for_each_type_zipped_impl(F&& f, IndexSequence<Indices...>)
|
||||||
{
|
{
|
||||||
(forward<F>(f)(TypeWrapper<typename ListA::template Type<Indexes>> {}, TypeWrapper<typename ListB::template Type<Indexes>> {}), ...);
|
(forward<F>(f)(TypeWrapper<typename ListA::template Type<Indices>> {}, TypeWrapper<typename ListB::template Type<Indices>> {}), ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename ListA, typename ListB, typename F>
|
template<typename ListA, typename ListB, typename F>
|
||||||
|
@ -208,32 +208,32 @@ Ext2FS::BlockListShape Ext2FS::compute_block_list_shape(unsigned blocks) const
|
|||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::write_indirect_block(BlockBasedFS::BlockIndex block, Span<BlockBasedFS::BlockIndex> blocks_indexes)
|
KResult Ext2FSInode::write_indirect_block(BlockBasedFS::BlockIndex block, Span<BlockBasedFS::BlockIndex> blocks_indices)
|
||||||
{
|
{
|
||||||
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
||||||
VERIFY(blocks_indexes.size() <= entries_per_block);
|
VERIFY(blocks_indices.size() <= entries_per_block);
|
||||||
|
|
||||||
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
||||||
OutputMemoryStream stream { block_contents };
|
OutputMemoryStream stream { block_contents };
|
||||||
auto buffer = UserOrKernelBuffer::for_kernel_buffer(stream.data());
|
auto buffer = UserOrKernelBuffer::for_kernel_buffer(stream.data());
|
||||||
|
|
||||||
VERIFY(blocks_indexes.size() <= EXT2_ADDR_PER_BLOCK(&fs().super_block()));
|
VERIFY(blocks_indices.size() <= EXT2_ADDR_PER_BLOCK(&fs().super_block()));
|
||||||
for (unsigned i = 0; i < blocks_indexes.size(); ++i)
|
for (unsigned i = 0; i < blocks_indices.size(); ++i)
|
||||||
stream << static_cast<u32>(blocks_indexes[i].value());
|
stream << static_cast<u32>(blocks_indices[i].value());
|
||||||
stream.fill_to_end(0);
|
stream.fill_to_end(0);
|
||||||
|
|
||||||
return fs().write_block(block, buffer, stream.size());
|
return fs().write_block(block, buffer, stream.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::grow_doubly_indirect_block(BlockBasedFS::BlockIndex block, size_t old_blocks_length, Span<BlockBasedFS::BlockIndex> blocks_indexes, Vector<Ext2FS::BlockIndex>& new_meta_blocks, unsigned& meta_blocks)
|
KResult Ext2FSInode::grow_doubly_indirect_block(BlockBasedFS::BlockIndex block, size_t old_blocks_length, Span<BlockBasedFS::BlockIndex> blocks_indices, Vector<Ext2FS::BlockIndex>& new_meta_blocks, unsigned& meta_blocks)
|
||||||
{
|
{
|
||||||
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
||||||
const auto entries_per_doubly_indirect_block = entries_per_block * entries_per_block;
|
const auto entries_per_doubly_indirect_block = entries_per_block * entries_per_block;
|
||||||
const auto old_indirect_blocks_length = divide_rounded_up(old_blocks_length, entries_per_block);
|
const auto old_indirect_blocks_length = divide_rounded_up(old_blocks_length, entries_per_block);
|
||||||
const auto new_indirect_blocks_length = divide_rounded_up(blocks_indexes.size(), entries_per_block);
|
const auto new_indirect_blocks_length = divide_rounded_up(blocks_indices.size(), entries_per_block);
|
||||||
VERIFY(blocks_indexes.size() > 0);
|
VERIFY(blocks_indices.size() > 0);
|
||||||
VERIFY(blocks_indexes.size() > old_blocks_length);
|
VERIFY(blocks_indices.size() > old_blocks_length);
|
||||||
VERIFY(blocks_indexes.size() <= entries_per_doubly_indirect_block);
|
VERIFY(blocks_indices.size() <= entries_per_doubly_indirect_block);
|
||||||
|
|
||||||
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
||||||
auto* block_as_pointers = (unsigned*)block_contents.data();
|
auto* block_as_pointers = (unsigned*)block_contents.data();
|
||||||
@ -259,7 +259,7 @@ KResult Ext2FSInode::grow_doubly_indirect_block(BlockBasedFS::BlockIndex block,
|
|||||||
// Write out the indirect blocks.
|
// Write out the indirect blocks.
|
||||||
for (unsigned i = old_blocks_length / entries_per_block; i < new_indirect_blocks_length; i++) {
|
for (unsigned i = old_blocks_length / entries_per_block; i < new_indirect_blocks_length; i++) {
|
||||||
const auto offset_block = i * entries_per_block;
|
const auto offset_block = i * entries_per_block;
|
||||||
if (auto result = write_indirect_block(block_as_pointers[i], blocks_indexes.slice(offset_block, min(blocks_indexes.size() - offset_block, entries_per_block))); result.is_error())
|
if (auto result = write_indirect_block(block_as_pointers[i], blocks_indices.slice(offset_block, min(blocks_indices.size() - offset_block, entries_per_block))); result.is_error())
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -302,16 +302,16 @@ KResult Ext2FSInode::shrink_doubly_indirect_block(BlockBasedFS::BlockIndex block
|
|||||||
return KSuccess;
|
return KSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
KResult Ext2FSInode::grow_triply_indirect_block(BlockBasedFS::BlockIndex block, size_t old_blocks_length, Span<BlockBasedFS::BlockIndex> blocks_indexes, Vector<Ext2FS::BlockIndex>& new_meta_blocks, unsigned& meta_blocks)
|
KResult Ext2FSInode::grow_triply_indirect_block(BlockBasedFS::BlockIndex block, size_t old_blocks_length, Span<BlockBasedFS::BlockIndex> blocks_indices, Vector<Ext2FS::BlockIndex>& new_meta_blocks, unsigned& meta_blocks)
|
||||||
{
|
{
|
||||||
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
const auto entries_per_block = EXT2_ADDR_PER_BLOCK(&fs().super_block());
|
||||||
const auto entries_per_doubly_indirect_block = entries_per_block * entries_per_block;
|
const auto entries_per_doubly_indirect_block = entries_per_block * entries_per_block;
|
||||||
const auto entries_per_triply_indirect_block = entries_per_block * entries_per_block;
|
const auto entries_per_triply_indirect_block = entries_per_block * entries_per_block;
|
||||||
const auto old_doubly_indirect_blocks_length = divide_rounded_up(old_blocks_length, entries_per_doubly_indirect_block);
|
const auto old_doubly_indirect_blocks_length = divide_rounded_up(old_blocks_length, entries_per_doubly_indirect_block);
|
||||||
const auto new_doubly_indirect_blocks_length = divide_rounded_up(blocks_indexes.size(), entries_per_doubly_indirect_block);
|
const auto new_doubly_indirect_blocks_length = divide_rounded_up(blocks_indices.size(), entries_per_doubly_indirect_block);
|
||||||
VERIFY(blocks_indexes.size() > 0);
|
VERIFY(blocks_indices.size() > 0);
|
||||||
VERIFY(blocks_indexes.size() > old_blocks_length);
|
VERIFY(blocks_indices.size() > old_blocks_length);
|
||||||
VERIFY(blocks_indexes.size() <= entries_per_triply_indirect_block);
|
VERIFY(blocks_indices.size() <= entries_per_triply_indirect_block);
|
||||||
|
|
||||||
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
auto block_contents = ByteBuffer::create_uninitialized(fs().block_size());
|
||||||
auto* block_as_pointers = (unsigned*)block_contents.data();
|
auto* block_as_pointers = (unsigned*)block_contents.data();
|
||||||
@ -338,8 +338,8 @@ KResult Ext2FSInode::grow_triply_indirect_block(BlockBasedFS::BlockIndex block,
|
|||||||
for (unsigned i = old_blocks_length / entries_per_doubly_indirect_block; i < new_doubly_indirect_blocks_length; i++) {
|
for (unsigned i = old_blocks_length / entries_per_doubly_indirect_block; i < new_doubly_indirect_blocks_length; i++) {
|
||||||
const auto processed_blocks = i * entries_per_doubly_indirect_block;
|
const auto processed_blocks = i * entries_per_doubly_indirect_block;
|
||||||
const auto old_doubly_indirect_blocks_length = min(old_blocks_length > processed_blocks ? old_blocks_length - processed_blocks : 0, entries_per_doubly_indirect_block);
|
const auto old_doubly_indirect_blocks_length = min(old_blocks_length > processed_blocks ? old_blocks_length - processed_blocks : 0, entries_per_doubly_indirect_block);
|
||||||
const auto new_doubly_indirect_blocks_length = min(blocks_indexes.size() > processed_blocks ? blocks_indexes.size() - processed_blocks : 0, entries_per_doubly_indirect_block);
|
const auto new_doubly_indirect_blocks_length = min(blocks_indices.size() > processed_blocks ? blocks_indices.size() - processed_blocks : 0, entries_per_doubly_indirect_block);
|
||||||
if (auto result = grow_doubly_indirect_block(block_as_pointers[i], old_doubly_indirect_blocks_length, blocks_indexes.slice(processed_blocks, new_doubly_indirect_blocks_length), new_meta_blocks, meta_blocks); result.is_error())
|
if (auto result = grow_doubly_indirect_block(block_as_pointers[i], old_doubly_indirect_blocks_length, blocks_indices.slice(processed_blocks, new_doubly_indirect_blocks_length), new_meta_blocks, meta_blocks); result.is_error())
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,15 +161,15 @@ public:
|
|||||||
Vector<u8> to_vector() const
|
Vector<u8> to_vector() const
|
||||||
{
|
{
|
||||||
// FIXME: Add a sync mechanism!
|
// FIXME: Add a sync mechanism!
|
||||||
Vector<u8> indexes;
|
Vector<u8> indices;
|
||||||
u32 bitfield = m_bitfield & m_bit_mask;
|
u32 bitfield = m_bitfield & m_bit_mask;
|
||||||
for (size_t index = 0; index < 32; index++) {
|
for (size_t index = 0; index < 32; index++) {
|
||||||
if (bitfield & 1) {
|
if (bitfield & 1) {
|
||||||
indexes.append(index);
|
indices.append(index);
|
||||||
}
|
}
|
||||||
bitfield >>= 1;
|
bitfield >>= 1;
|
||||||
}
|
}
|
||||||
return indexes;
|
return indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 bit_mask() const { return m_bit_mask; };
|
u32 bit_mask() const { return m_bit_mask; };
|
||||||
|
@ -343,7 +343,7 @@ DirectoryView::~DirectoryView()
|
|||||||
|
|
||||||
void DirectoryView::model_did_update(unsigned flags)
|
void DirectoryView::model_did_update(unsigned flags)
|
||||||
{
|
{
|
||||||
if (flags & GUI::Model::UpdateFlag::InvalidateAllIndexes) {
|
if (flags & GUI::Model::UpdateFlag::InvalidateAllIndices) {
|
||||||
for_each_view_implementation([](auto& view) {
|
for_each_view_implementation([](auto& view) {
|
||||||
view.selection().clear();
|
view.selection().clear();
|
||||||
});
|
});
|
||||||
|
@ -152,7 +152,7 @@ void SheetModel::set_data(const GUI::ModelIndex& index, const GUI::Variant& valu
|
|||||||
void SheetModel::update()
|
void SheetModel::update()
|
||||||
{
|
{
|
||||||
m_sheet->update();
|
m_sheet->update();
|
||||||
did_update(UpdateFlag::DontInvalidateIndexes);
|
did_update(UpdateFlag::DontInvalidateIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -191,7 +191,7 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet)
|
|||||||
|
|
||||||
m_table_view->on_selection_change = [&] {
|
m_table_view->on_selection_change = [&] {
|
||||||
m_sheet->selected_cells().clear();
|
m_sheet->selected_cells().clear();
|
||||||
for (auto& index : m_table_view->selection().indexes()) {
|
for (auto& index : m_table_view->selection().indices()) {
|
||||||
Position position { (size_t)index.column(), (size_t)index.row() };
|
Position position { (size_t)index.column(), (size_t)index.row() };
|
||||||
m_sheet->selected_cells().set(position);
|
m_sheet->selected_cells().set(position);
|
||||||
}
|
}
|
||||||
@ -201,7 +201,7 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet)
|
|||||||
|
|
||||||
Vector<Position> selected_positions;
|
Vector<Position> selected_positions;
|
||||||
selected_positions.ensure_capacity(m_table_view->selection().size());
|
selected_positions.ensure_capacity(m_table_view->selection().size());
|
||||||
for (auto& selection : m_table_view->selection().indexes())
|
for (auto& selection : m_table_view->selection().indices())
|
||||||
selected_positions.empend((size_t)selection.column(), (size_t)selection.row());
|
selected_positions.empend((size_t)selection.column(), (size_t)selection.row());
|
||||||
|
|
||||||
if (on_selection_changed) {
|
if (on_selection_changed) {
|
||||||
@ -222,7 +222,7 @@ SpreadsheetView::SpreadsheetView(Sheet& sheet)
|
|||||||
m_cell_range_context_menu = GUI::Menu::construct();
|
m_cell_range_context_menu = GUI::Menu::construct();
|
||||||
m_cell_range_context_menu->add_action(GUI::Action::create("Type and Formatting...", [this](auto&) {
|
m_cell_range_context_menu->add_action(GUI::Action::create("Type and Formatting...", [this](auto&) {
|
||||||
Vector<Position> positions;
|
Vector<Position> positions;
|
||||||
for (auto& index : m_table_view->selection().indexes()) {
|
for (auto& index : m_table_view->selection().indices()) {
|
||||||
Position position { (size_t)index.column(), (size_t)index.row() };
|
Position position { (size_t)index.column(), (size_t)index.row() };
|
||||||
positions.append(move(position));
|
positions.append(move(position));
|
||||||
}
|
}
|
||||||
@ -295,7 +295,7 @@ void SpreadsheetView::show_event(GUI::ShowEvent&)
|
|||||||
if (on_selection_changed && !m_table_view->selection().is_empty()) {
|
if (on_selection_changed && !m_table_view->selection().is_empty()) {
|
||||||
Vector<Position> selected_positions;
|
Vector<Position> selected_positions;
|
||||||
selected_positions.ensure_capacity(m_table_view->selection().size());
|
selected_positions.ensure_capacity(m_table_view->selection().size());
|
||||||
for (auto& selection : m_table_view->selection().indexes())
|
for (auto& selection : m_table_view->selection().indices())
|
||||||
selected_positions.empend((size_t)selection.column(), (size_t)selection.row());
|
selected_positions.empend((size_t)selection.column(), (size_t)selection.row());
|
||||||
|
|
||||||
on_selection_changed(move(selected_positions));
|
on_selection_changed(move(selected_positions));
|
||||||
|
@ -416,7 +416,7 @@ void ProcessModel::update()
|
|||||||
if (on_state_update)
|
if (on_state_update)
|
||||||
on_state_update(all_processes->size(), m_threads.size());
|
on_state_update(all_processes->size(), m_threads.size());
|
||||||
|
|
||||||
// FIXME: This is a rather hackish way of invalidating indexes.
|
// FIXME: This is a rather hackish way of invalidating indices.
|
||||||
// It would be good if GUI::Model had a way to orchestrate removal/insertion while preserving indexes.
|
// It would be good if GUI::Model had a way to orchestrate removal/insertion while preserving indices.
|
||||||
did_update(previous_tid_count == m_tids.size() ? GUI::Model::UpdateFlag::DontInvalidateIndexes : GUI::Model::UpdateFlag::InvalidateAllIndexes);
|
did_update(previous_tid_count == m_tids.size() ? GUI::Model::UpdateFlag::DontInvalidateIndices : GUI::Model::UpdateFlag::InvalidateAllIndices);
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ public:
|
|||||||
|
|
||||||
virtual void update() override
|
virtual void update() override
|
||||||
{
|
{
|
||||||
did_update(GUI::Model::DontInvalidateIndexes);
|
did_update(GUI::Model::DontInvalidateIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void model_did_update([[maybe_unused]] unsigned flags) override
|
virtual void model_did_update([[maybe_unused]] unsigned flags) override
|
||||||
|
@ -67,5 +67,5 @@ GUI::Variant IndividualSampleModel::data(const GUI::ModelIndex& index, GUI::Mode
|
|||||||
|
|
||||||
void IndividualSampleModel::update()
|
void IndividualSampleModel::update()
|
||||||
{
|
{
|
||||||
did_update(Model::InvalidateAllIndexes);
|
did_update(Model::InvalidateAllIndices);
|
||||||
}
|
}
|
||||||
|
@ -127,5 +127,5 @@ GUI::Variant ProfileModel::data(const GUI::ModelIndex& index, GUI::ModelRole rol
|
|||||||
|
|
||||||
void ProfileModel::update()
|
void ProfileModel::update()
|
||||||
{
|
{
|
||||||
did_update(Model::InvalidateAllIndexes);
|
did_update(Model::InvalidateAllIndices);
|
||||||
}
|
}
|
||||||
|
@ -89,5 +89,5 @@ GUI::Variant SamplesModel::data(const GUI::ModelIndex& index, GUI::ModelRole rol
|
|||||||
|
|
||||||
void SamplesModel::update()
|
void SamplesModel::update()
|
||||||
{
|
{
|
||||||
did_update(Model::InvalidateAllIndexes);
|
did_update(Model::InvalidateAllIndices);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ typedef uint32_t Elf64_Half;
|
|||||||
typedef uint16_t Elf64_Quarter;
|
typedef uint16_t Elf64_Quarter;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* e_ident[] identification indexes
|
* e_ident[] identification indices
|
||||||
* See http://www.sco.com/developers/gabi/latest/ch4.eheader.html
|
* See http://www.sco.com/developers/gabi/latest/ch4.eheader.html
|
||||||
*/
|
*/
|
||||||
#define EI_MAG0 0 /* file ID */
|
#define EI_MAG0 0 /* file ID */
|
||||||
@ -241,15 +241,15 @@ typedef struct {
|
|||||||
Elf64_Xword sh_entsize; /* table entry size */
|
Elf64_Xword sh_entsize; /* table entry size */
|
||||||
} Elf64_Shdr;
|
} Elf64_Shdr;
|
||||||
|
|
||||||
/* Special Section Indexes */
|
/* Special Section Indices */
|
||||||
#define SHN_UNDEF 0 /* undefined */
|
#define SHN_UNDEF 0 /* undefined */
|
||||||
#define SHN_LORESERVE 0xff00 /* lower bounds of reserved indexes */
|
#define SHN_LORESERVE 0xff00 /* lower bounds of reserved indices */
|
||||||
#define SHN_LOPROC 0xff00 /* reserved range for processor */
|
#define SHN_LOPROC 0xff00 /* reserved range for processor */
|
||||||
#define SHN_HIPROC 0xff1f /* specific section indexes */
|
#define SHN_HIPROC 0xff1f /* specific section indices */
|
||||||
#define SHN_ABS 0xfff1 /* absolute value */
|
#define SHN_ABS 0xfff1 /* absolute value */
|
||||||
#define SHN_COMMON 0xfff2 /* common symbol */
|
#define SHN_COMMON 0xfff2 /* common symbol */
|
||||||
#define SHN_XINDEX 0xffff /* Escape -- index stored elsewhere. */
|
#define SHN_XINDEX 0xffff /* Escape -- index stored elsewhere. */
|
||||||
#define SHN_HIRESERVE 0xffff /* upper bounds of reserved indexes */
|
#define SHN_HIRESERVE 0xffff /* upper bounds of reserved indices */
|
||||||
|
|
||||||
/* sh_type */
|
/* sh_type */
|
||||||
#define SHT_NULL 0 /* inactive */
|
#define SHT_NULL 0 /* inactive */
|
||||||
@ -269,7 +269,7 @@ typedef struct {
|
|||||||
#define SHT_FINI_ARRAY 15 /* pointers to termination functions */
|
#define SHT_FINI_ARRAY 15 /* pointers to termination functions */
|
||||||
#define SHT_PREINIT_ARRAY 16 /* ptrs to funcs called before init */
|
#define SHT_PREINIT_ARRAY 16 /* ptrs to funcs called before init */
|
||||||
#define SHT_GROUP 17 /* defines a section group */
|
#define SHT_GROUP 17 /* defines a section group */
|
||||||
#define SHT_SYMTAB_SHNDX 18 /* Section indexes (see SHN_XINDEX). */
|
#define SHT_SYMTAB_SHNDX 18 /* Section indices (see SHN_XINDEX). */
|
||||||
#define SHT_LOOS 0x60000000 /* reserved range for OS specific */
|
#define SHT_LOOS 0x60000000 /* reserved range for OS specific */
|
||||||
#define SHT_SUNW_dof 0x6ffffff4 /* used by dtrace */
|
#define SHT_SUNW_dof 0x6ffffff4 /* used by dtrace */
|
||||||
#define SHT_GNU_LIBLIST 0x6ffffff7 /* libraries to be prelinked */
|
#define SHT_GNU_LIBLIST 0x6ffffff7 /* libraries to be prelinked */
|
||||||
@ -282,7 +282,7 @@ typedef struct {
|
|||||||
#define SHT_LOPROC 0x70000000 /* reserved range for processor */
|
#define SHT_LOPROC 0x70000000 /* reserved range for processor */
|
||||||
#define SHT_HIPROC 0x7fffffff /* specific section header types */
|
#define SHT_HIPROC 0x7fffffff /* specific section header types */
|
||||||
#define SHT_LOUSER 0x80000000 /* reserved range for application */
|
#define SHT_LOUSER 0x80000000 /* reserved range for application */
|
||||||
#define SHT_HIUSER 0xffffffff /* specific indexes */
|
#define SHT_HIUSER 0xffffffff /* specific indices */
|
||||||
|
|
||||||
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table section */
|
#define SHT_GNU_HASH 0x6ffffff6 /* GNU-style hash table section */
|
||||||
|
|
||||||
|
@ -578,7 +578,7 @@ FLATTEN void UnsignedBigInteger::shift_left_without_allocation(
|
|||||||
* Complexity: O(N^2) where N is the number of words in the larger number
|
* Complexity: O(N^2) where N is the number of words in the larger number
|
||||||
* Multiplication method:
|
* Multiplication method:
|
||||||
* An integer is equal to the sum of the powers of two
|
* An integer is equal to the sum of the powers of two
|
||||||
* according to the indexes of its 'on' bits.
|
* according to the indices of its 'on' bits.
|
||||||
* So to multiple x*y, we go over each '1' bit in x (say the i'th bit),
|
* So to multiple x*y, we go over each '1' bit in x (say the i'th bit),
|
||||||
* and add y<<i to the result.
|
* and add y<<i to the result.
|
||||||
*/
|
*/
|
||||||
|
@ -43,13 +43,13 @@ void AbstractView::set_model(RefPtr<Model> model)
|
|||||||
m_model = move(model);
|
m_model = move(model);
|
||||||
if (m_model)
|
if (m_model)
|
||||||
m_model->register_view({}, *this);
|
m_model->register_view({}, *this);
|
||||||
model_did_update(GUI::Model::InvalidateAllIndexes);
|
model_did_update(GUI::Model::InvalidateAllIndices);
|
||||||
scroll_to_top();
|
scroll_to_top();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AbstractView::model_did_update(unsigned int flags)
|
void AbstractView::model_did_update(unsigned int flags)
|
||||||
{
|
{
|
||||||
if (!model() || (flags & GUI::Model::InvalidateAllIndexes)) {
|
if (!model() || (flags & GUI::Model::InvalidateAllIndices)) {
|
||||||
stop_editing();
|
stop_editing();
|
||||||
m_edit_index = {};
|
m_edit_index = {};
|
||||||
m_hovered_index = {};
|
m_hovered_index = {};
|
||||||
@ -630,9 +630,9 @@ void AbstractView::do_search(String&& searching)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto found_indexes = model()->matches(searching, Model::MatchesFlag::FirstMatchOnly | Model::MatchesFlag::MatchAtStart | Model::MatchesFlag::CaseInsensitive, model()->parent_index(cursor_index()));
|
auto found_indices = model()->matches(searching, Model::MatchesFlag::FirstMatchOnly | Model::MatchesFlag::MatchAtStart | Model::MatchesFlag::CaseInsensitive, model()->parent_index(cursor_index()));
|
||||||
if (!found_indexes.is_empty() && found_indexes[0].is_valid()) {
|
if (!found_indices.is_empty() && found_indices[0].is_valid()) {
|
||||||
auto& index = found_indexes[0];
|
auto& index = found_indices[0];
|
||||||
m_highlighted_search_index = index;
|
m_highlighted_search_index = index;
|
||||||
m_searching = move(searching);
|
m_searching = move(searching);
|
||||||
set_selection(index);
|
set_selection(index);
|
||||||
|
@ -629,17 +629,17 @@ Vector<ModelIndex, 1> FileSystemModel::matches(const StringView& searching, unsi
|
|||||||
{
|
{
|
||||||
Node& node = const_cast<Node&>(this->node(index));
|
Node& node = const_cast<Node&>(this->node(index));
|
||||||
node.reify_if_needed();
|
node.reify_if_needed();
|
||||||
Vector<ModelIndex, 1> found_indexes;
|
Vector<ModelIndex, 1> found_indices;
|
||||||
for (auto& child : node.children) {
|
for (auto& child : node.children) {
|
||||||
if (string_matches(child.name, searching, flags)) {
|
if (string_matches(child.name, searching, flags)) {
|
||||||
const_cast<Node&>(child).reify_if_needed();
|
const_cast<Node&>(child).reify_if_needed();
|
||||||
found_indexes.append(child.index(Column::Name));
|
found_indices.append(child.index(Column::Name));
|
||||||
if (flags & FirstMatchOnly)
|
if (flags & FirstMatchOnly)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return found_indexes;
|
return found_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -106,10 +106,10 @@ bool FilteringProxyModel::is_searchable() const
|
|||||||
|
|
||||||
Vector<ModelIndex, 1> FilteringProxyModel::matches(const StringView& searching, unsigned flags, const ModelIndex& index)
|
Vector<ModelIndex, 1> FilteringProxyModel::matches(const StringView& searching, unsigned flags, const ModelIndex& index)
|
||||||
{
|
{
|
||||||
auto found_indexes = m_model.matches(searching, flags, index);
|
auto found_indices = m_model.matches(searching, flags, index);
|
||||||
for (size_t i = 0; i < found_indexes.size(); i++)
|
for (size_t i = 0; i < found_indices.size(); i++)
|
||||||
found_indexes[i] = map(found_indexes[i]);
|
found_indices[i] = map(found_indices[i]);
|
||||||
return found_indexes;
|
return found_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -122,7 +122,7 @@ auto IconView::item_data_from_content_position(const Gfx::IntPoint& content_posi
|
|||||||
void IconView::model_did_update(unsigned flags)
|
void IconView::model_did_update(unsigned flags)
|
||||||
{
|
{
|
||||||
AbstractView::model_did_update(flags);
|
AbstractView::model_did_update(flags);
|
||||||
if (!model() || (flags & GUI::Model::InvalidateAllIndexes)) {
|
if (!model() || (flags & GUI::Model::InvalidateAllIndices)) {
|
||||||
m_item_data_cache.clear();
|
m_item_data_cache.clear();
|
||||||
AbstractView::clear_selection();
|
AbstractView::clear_selection();
|
||||||
m_selected_count_cache = 0;
|
m_selected_count_cache = 0;
|
||||||
|
@ -37,8 +37,8 @@ public:
|
|||||||
class Model : public RefCounted<Model> {
|
class Model : public RefCounted<Model> {
|
||||||
public:
|
public:
|
||||||
enum UpdateFlag {
|
enum UpdateFlag {
|
||||||
DontInvalidateIndexes = 0,
|
DontInvalidateIndices = 0,
|
||||||
InvalidateAllIndexes = 1 << 0,
|
InvalidateAllIndices = 1 << 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum MatchesFlag {
|
enum MatchesFlag {
|
||||||
@ -88,7 +88,7 @@ protected:
|
|||||||
Model();
|
Model();
|
||||||
|
|
||||||
void for_each_view(Function<void(AbstractView&)>);
|
void for_each_view(Function<void(AbstractView&)>);
|
||||||
void did_update(unsigned flags = UpdateFlag::InvalidateAllIndexes);
|
void did_update(unsigned flags = UpdateFlag::InvalidateAllIndices);
|
||||||
|
|
||||||
static bool string_matches(const StringView& str, const StringView& needle, unsigned flags)
|
static bool string_matches(const StringView& str, const StringView& needle, unsigned flags)
|
||||||
{
|
{
|
||||||
|
@ -14,13 +14,13 @@ namespace GUI {
|
|||||||
void ModelSelection::remove_matching(Function<bool(const ModelIndex&)> filter)
|
void ModelSelection::remove_matching(Function<bool(const ModelIndex&)> filter)
|
||||||
{
|
{
|
||||||
Vector<ModelIndex> to_remove;
|
Vector<ModelIndex> to_remove;
|
||||||
for (auto& index : m_indexes) {
|
for (auto& index : m_indices) {
|
||||||
if (filter(index))
|
if (filter(index))
|
||||||
to_remove.append(index);
|
to_remove.append(index);
|
||||||
}
|
}
|
||||||
if (!to_remove.is_empty()) {
|
if (!to_remove.is_empty()) {
|
||||||
for (auto& index : to_remove)
|
for (auto& index : to_remove)
|
||||||
m_indexes.remove(index);
|
m_indices.remove(index);
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -28,19 +28,19 @@ void ModelSelection::remove_matching(Function<bool(const ModelIndex&)> filter)
|
|||||||
void ModelSelection::set(const ModelIndex& index)
|
void ModelSelection::set(const ModelIndex& index)
|
||||||
{
|
{
|
||||||
VERIFY(index.is_valid());
|
VERIFY(index.is_valid());
|
||||||
if (m_indexes.size() == 1 && m_indexes.contains(index))
|
if (m_indices.size() == 1 && m_indices.contains(index))
|
||||||
return;
|
return;
|
||||||
m_indexes.clear();
|
m_indices.clear();
|
||||||
m_indexes.set(index);
|
m_indices.set(index);
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelSelection::add(const ModelIndex& index)
|
void ModelSelection::add(const ModelIndex& index)
|
||||||
{
|
{
|
||||||
VERIFY(index.is_valid());
|
VERIFY(index.is_valid());
|
||||||
if (m_indexes.contains(index))
|
if (m_indices.contains(index))
|
||||||
return;
|
return;
|
||||||
m_indexes.set(index);
|
m_indices.set(index);
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,28 +59,28 @@ void ModelSelection::add_all(const Vector<ModelIndex>& indices)
|
|||||||
void ModelSelection::toggle(const ModelIndex& index)
|
void ModelSelection::toggle(const ModelIndex& index)
|
||||||
{
|
{
|
||||||
VERIFY(index.is_valid());
|
VERIFY(index.is_valid());
|
||||||
if (m_indexes.contains(index))
|
if (m_indices.contains(index))
|
||||||
m_indexes.remove(index);
|
m_indices.remove(index);
|
||||||
else
|
else
|
||||||
m_indexes.set(index);
|
m_indices.set(index);
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ModelSelection::remove(const ModelIndex& index)
|
bool ModelSelection::remove(const ModelIndex& index)
|
||||||
{
|
{
|
||||||
VERIFY(index.is_valid());
|
VERIFY(index.is_valid());
|
||||||
if (!m_indexes.contains(index))
|
if (!m_indices.contains(index))
|
||||||
return false;
|
return false;
|
||||||
m_indexes.remove(index);
|
m_indices.remove(index);
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelSelection::clear()
|
void ModelSelection::clear()
|
||||||
{
|
{
|
||||||
if (m_indexes.is_empty())
|
if (m_indices.is_empty())
|
||||||
return;
|
return;
|
||||||
m_indexes.clear();
|
m_indices.clear();
|
||||||
notify_selection_changed();
|
notify_selection_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,12 +25,12 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int size() const { return m_indexes.size(); }
|
int size() const { return m_indices.size(); }
|
||||||
bool is_empty() const { return m_indexes.is_empty(); }
|
bool is_empty() const { return m_indices.is_empty(); }
|
||||||
bool contains(const ModelIndex& index) const { return m_indexes.contains(index); }
|
bool contains(const ModelIndex& index) const { return m_indices.contains(index); }
|
||||||
bool contains_row(int row) const
|
bool contains_row(int row) const
|
||||||
{
|
{
|
||||||
for (auto& index : m_indexes) {
|
for (auto& index : m_indices) {
|
||||||
if (index.row() == row)
|
if (index.row() == row)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -47,33 +47,33 @@ public:
|
|||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
void for_each_index(Callback callback)
|
void for_each_index(Callback callback)
|
||||||
{
|
{
|
||||||
for (auto& index : indexes())
|
for (auto& index : indices())
|
||||||
callback(index);
|
callback(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Callback>
|
template<typename Callback>
|
||||||
void for_each_index(Callback callback) const
|
void for_each_index(Callback callback) const
|
||||||
{
|
{
|
||||||
for (auto& index : indexes())
|
for (auto& index : indices())
|
||||||
callback(index);
|
callback(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector<ModelIndex> indexes() const
|
Vector<ModelIndex> indices() const
|
||||||
{
|
{
|
||||||
Vector<ModelIndex> selected_indexes;
|
Vector<ModelIndex> selected_indices;
|
||||||
|
|
||||||
for (auto& index : m_indexes)
|
for (auto& index : m_indices)
|
||||||
selected_indexes.append(index);
|
selected_indices.append(index);
|
||||||
|
|
||||||
return selected_indexes;
|
return selected_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: This doesn't guarantee that what you get is the lowest or "first" index selected..
|
// FIXME: This doesn't guarantee that what you get is the lowest or "first" index selected..
|
||||||
ModelIndex first() const
|
ModelIndex first() const
|
||||||
{
|
{
|
||||||
if (m_indexes.is_empty())
|
if (m_indices.is_empty())
|
||||||
return {};
|
return {};
|
||||||
return *m_indexes.begin();
|
return *m_indices.begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_matching(Function<bool(const ModelIndex&)>);
|
void remove_matching(Function<bool(const ModelIndex&)>);
|
||||||
@ -94,7 +94,7 @@ private:
|
|||||||
void notify_selection_changed();
|
void notify_selection_changed();
|
||||||
|
|
||||||
AbstractView& m_view;
|
AbstractView& m_view;
|
||||||
HashTable<ModelIndex> m_indexes;
|
HashTable<ModelIndex> m_indices;
|
||||||
bool m_disable_notify { false };
|
bool m_disable_notify { false };
|
||||||
bool m_notify_pending { false };
|
bool m_notify_pending { false };
|
||||||
};
|
};
|
||||||
|
@ -24,7 +24,7 @@ SortingProxyModel::~SortingProxyModel()
|
|||||||
|
|
||||||
void SortingProxyModel::invalidate(unsigned int flags)
|
void SortingProxyModel::invalidate(unsigned int flags)
|
||||||
{
|
{
|
||||||
if (flags == UpdateFlag::DontInvalidateIndexes) {
|
if (flags == UpdateFlag::DontInvalidateIndices) {
|
||||||
sort(m_last_key_column, m_last_sort_order);
|
sort(m_last_key_column, m_last_sort_order);
|
||||||
} else {
|
} else {
|
||||||
m_mappings.clear();
|
m_mappings.clear();
|
||||||
@ -201,20 +201,20 @@ void SortingProxyModel::sort_mapping(Mapping& mapping, int column, SortOrder sor
|
|||||||
|
|
||||||
// Update the view's selection.
|
// Update the view's selection.
|
||||||
view.selection().change_from_model({}, [&](ModelSelection& selection) {
|
view.selection().change_from_model({}, [&](ModelSelection& selection) {
|
||||||
Vector<ModelIndex> selected_indexes_in_source;
|
Vector<ModelIndex> selected_indices_in_source;
|
||||||
Vector<ModelIndex> stale_indexes_in_selection;
|
Vector<ModelIndex> stale_indices_in_selection;
|
||||||
selection.for_each_index([&](const ModelIndex& index) {
|
selection.for_each_index([&](const ModelIndex& index) {
|
||||||
if (index.parent() == mapping.source_parent) {
|
if (index.parent() == mapping.source_parent) {
|
||||||
stale_indexes_in_selection.append(index);
|
stale_indices_in_selection.append(index);
|
||||||
selected_indexes_in_source.append(source().index(old_source_rows[index.row()], index.column(), mapping.source_parent));
|
selected_indices_in_source.append(source().index(old_source_rows[index.row()], index.column(), mapping.source_parent));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for (auto& index : stale_indexes_in_selection) {
|
for (auto& index : stale_indices_in_selection) {
|
||||||
selection.remove(index);
|
selection.remove(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& index : selected_indexes_in_source) {
|
for (auto& index : selected_indices_in_source) {
|
||||||
for (size_t i = 0; i < mapping.source_rows.size(); ++i) {
|
for (size_t i = 0; i < mapping.source_rows.size(); ++i) {
|
||||||
if (mapping.source_rows[i] == index.row()) {
|
if (mapping.source_rows[i] == index.row()) {
|
||||||
auto new_source_index = this->index(i, index.column(), mapping.source_parent);
|
auto new_source_index = this->index(i, index.column(), mapping.source_parent);
|
||||||
@ -237,7 +237,7 @@ void SortingProxyModel::sort(int column, SortOrder sort_order)
|
|||||||
m_last_key_column = column;
|
m_last_key_column = column;
|
||||||
m_last_sort_order = sort_order;
|
m_last_sort_order = sort_order;
|
||||||
|
|
||||||
did_update(UpdateFlag::DontInvalidateIndexes);
|
did_update(UpdateFlag::DontInvalidateIndices);
|
||||||
}
|
}
|
||||||
|
|
||||||
SortingProxyModel::InternalMapIterator SortingProxyModel::build_mapping(const ModelIndex& source_parent)
|
SortingProxyModel::InternalMapIterator SortingProxyModel::build_mapping(const ModelIndex& source_parent)
|
||||||
@ -287,10 +287,10 @@ bool SortingProxyModel::is_searchable() const
|
|||||||
|
|
||||||
Vector<ModelIndex, 1> SortingProxyModel::matches(const StringView& searching, unsigned flags, const ModelIndex& proxy_index)
|
Vector<ModelIndex, 1> SortingProxyModel::matches(const StringView& searching, unsigned flags, const ModelIndex& proxy_index)
|
||||||
{
|
{
|
||||||
auto found_indexes = source().matches(searching, flags, map_to_source(proxy_index));
|
auto found_indices = source().matches(searching, flags, map_to_source(proxy_index));
|
||||||
for (size_t i = 0; i < found_indexes.size(); i++)
|
for (size_t i = 0; i < found_indices.size(); i++)
|
||||||
found_indexes[i] = map_to_proxy(found_indexes[i]);
|
found_indices[i] = map_to_proxy(found_indices[i]);
|
||||||
return found_indexes;
|
return found_indices;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
explicit SortingProxyModel(NonnullRefPtr<Model> source);
|
explicit SortingProxyModel(NonnullRefPtr<Model> source);
|
||||||
|
|
||||||
// NOTE: The internal_data() of indexes points to the corresponding Mapping object for that index.
|
// NOTE: The internal_data() of indices points to the corresponding Mapping object for that index.
|
||||||
struct Mapping {
|
struct Mapping {
|
||||||
Vector<int> source_rows;
|
Vector<int> source_rows;
|
||||||
Vector<int> proxy_rows;
|
Vector<int> proxy_rows;
|
||||||
@ -63,7 +63,7 @@ private:
|
|||||||
Model& source() { return *m_source; }
|
Model& source() { return *m_source; }
|
||||||
const Model& source() const { return *m_source; }
|
const Model& source() const { return *m_source; }
|
||||||
|
|
||||||
void invalidate(unsigned flags = Model::UpdateFlag::DontInvalidateIndexes);
|
void invalidate(unsigned flags = Model::UpdateFlag::DontInvalidateIndices);
|
||||||
InternalMapIterator build_mapping(const ModelIndex& proxy_index);
|
InternalMapIterator build_mapping(const ModelIndex& proxy_index);
|
||||||
|
|
||||||
NonnullRefPtr<Model> m_source;
|
NonnullRefPtr<Model> m_source;
|
||||||
|
@ -430,10 +430,10 @@ NEVER_INLINE FLATTEN static bool unfilter(PNGLoadingContext& context)
|
|||||||
auto pixels_per_byte = 8 / context.bit_depth;
|
auto pixels_per_byte = 8 / context.bit_depth;
|
||||||
auto mask = (1 << context.bit_depth) - 1;
|
auto mask = (1 << context.bit_depth) - 1;
|
||||||
for (int y = 0; y < context.height; ++y) {
|
for (int y = 0; y < context.height; ++y) {
|
||||||
auto* palette_indexes = context.scanlines[y].data.data();
|
auto* palette_indices = context.scanlines[y].data.data();
|
||||||
for (int i = 0; i < context.width; ++i) {
|
for (int i = 0; i < context.width; ++i) {
|
||||||
auto bit_offset = (8 - context.bit_depth) - (context.bit_depth * (i % pixels_per_byte));
|
auto bit_offset = (8 - context.bit_depth) - (context.bit_depth * (i % pixels_per_byte));
|
||||||
auto palette_index = (palette_indexes[i / pixels_per_byte] >> bit_offset) & mask;
|
auto palette_index = (palette_indices[i / pixels_per_byte] >> bit_offset) & mask;
|
||||||
auto& pixel = (Pixel&)context.bitmap->scanline(y)[i];
|
auto& pixel = (Pixel&)context.bitmap->scanline(y)[i];
|
||||||
if ((size_t)palette_index >= context.palette_data.size())
|
if ((size_t)palette_index >= context.palette_data.size())
|
||||||
return false;
|
return false;
|
||||||
|
@ -79,21 +79,21 @@ describe("normal behavior", () => {
|
|||||||
}, 100);
|
}, 100);
|
||||||
expect(result).toBe(121);
|
expect(result).toBe(121);
|
||||||
|
|
||||||
var indexes = [];
|
var indices = [];
|
||||||
result = ["foo", 1, true].reduce((a, v, i) => {
|
result = ["foo", 1, true].reduce((a, v, i) => {
|
||||||
indexes.push(i);
|
indices.push(i);
|
||||||
});
|
});
|
||||||
expect(result).toBeUndefined();
|
expect(result).toBeUndefined();
|
||||||
expect(indexes.length).toBe(2);
|
expect(indices.length).toBe(2);
|
||||||
expect(indexes[0]).toBe(1);
|
expect(indices[0]).toBe(1);
|
||||||
expect(indexes[1]).toBe(2);
|
expect(indices[1]).toBe(2);
|
||||||
|
|
||||||
indexes = [];
|
indices = [];
|
||||||
result = ["foo", 1, true].reduce((a, v, i) => {
|
result = ["foo", 1, true].reduce((a, v, i) => {
|
||||||
indexes.push(i);
|
indices.push(i);
|
||||||
}, "foo");
|
}, "foo");
|
||||||
expect(result).toBeUndefined();
|
expect(result).toBeUndefined();
|
||||||
expect(indexes).toEqual([0, 1, 2]);
|
expect(indices).toEqual([0, 1, 2]);
|
||||||
|
|
||||||
var mutable = { prop: 0 };
|
var mutable = { prop: 0 };
|
||||||
result = ["foo", 1, true].reduce((a, v) => {
|
result = ["foo", 1, true].reduce((a, v) => {
|
||||||
|
@ -84,21 +84,21 @@ describe("normal behavior", () => {
|
|||||||
}, 100);
|
}, 100);
|
||||||
expect(result).toBe("100123456");
|
expect(result).toBe("100123456");
|
||||||
|
|
||||||
var indexes = [];
|
var indices = [];
|
||||||
result = ["foo", 1, true].reduceRight((a, v, i) => {
|
result = ["foo", 1, true].reduceRight((a, v, i) => {
|
||||||
indexes.push(i);
|
indices.push(i);
|
||||||
});
|
});
|
||||||
expect(result).toBeUndefined();
|
expect(result).toBeUndefined();
|
||||||
expect(indexes.length).toBe(2);
|
expect(indices.length).toBe(2);
|
||||||
expect(indexes[0]).toBe(1);
|
expect(indices[0]).toBe(1);
|
||||||
expect(indexes[1]).toBe(0);
|
expect(indices[1]).toBe(0);
|
||||||
|
|
||||||
indexes = [];
|
indices = [];
|
||||||
result = ["foo", 1, true].reduceRight((a, v, i) => {
|
result = ["foo", 1, true].reduceRight((a, v, i) => {
|
||||||
indexes.push(i);
|
indices.push(i);
|
||||||
}, "foo");
|
}, "foo");
|
||||||
expect(result).toBeUndefined();
|
expect(result).toBeUndefined();
|
||||||
expect(indexes).toEqual([2, 1, 0]);
|
expect(indices).toEqual([2, 1, 0]);
|
||||||
|
|
||||||
var mutable = { prop: 0 };
|
var mutable = { prop: 0 };
|
||||||
result = ["foo", 1, true].reduceRight((a, v) => {
|
result = ["foo", 1, true].reduceRight((a, v) => {
|
||||||
|
@ -618,15 +618,15 @@ void Menu::set_visible(bool visible)
|
|||||||
void Menu::add_item(NonnullOwnPtr<MenuItem> item)
|
void Menu::add_item(NonnullOwnPtr<MenuItem> item)
|
||||||
{
|
{
|
||||||
if (auto alt_shortcut = find_ampersand_shortcut_character(item->text())) {
|
if (auto alt_shortcut = find_ampersand_shortcut_character(item->text())) {
|
||||||
m_alt_shortcut_character_to_item_indexes.ensure(tolower(alt_shortcut)).append(m_items.size());
|
m_alt_shortcut_character_to_item_indices.ensure(tolower(alt_shortcut)).append(m_items.size());
|
||||||
}
|
}
|
||||||
m_items.append(move(item));
|
m_items.append(move(item));
|
||||||
}
|
}
|
||||||
|
|
||||||
const Vector<size_t>* Menu::items_with_alt_shortcut(u32 alt_shortcut) const
|
const Vector<size_t>* Menu::items_with_alt_shortcut(u32 alt_shortcut) const
|
||||||
{
|
{
|
||||||
auto it = m_alt_shortcut_character_to_item_indexes.find(tolower(alt_shortcut));
|
auto it = m_alt_shortcut_character_to_item_indices.find(tolower(alt_shortcut));
|
||||||
if (it == m_alt_shortcut_character_to_item_indexes.end())
|
if (it == m_alt_shortcut_character_to_item_indices.end())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return &it->value;
|
return &it->value;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +154,7 @@ private:
|
|||||||
int m_scroll_offset { 0 };
|
int m_scroll_offset { 0 };
|
||||||
int m_max_scroll_offset { 0 };
|
int m_max_scroll_offset { 0 };
|
||||||
|
|
||||||
HashMap<u32, Vector<size_t>> m_alt_shortcut_character_to_item_indexes;
|
HashMap<u32, Vector<size_t>> m_alt_shortcut_character_to_item_indices;
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 find_ampersand_shortcut_character(const StringView&);
|
u32 find_ampersand_shortcut_character(const StringView&);
|
||||||
|
@ -70,11 +70,11 @@ void MenuManager::event(Core::Event& event)
|
|||||||
&& ((key_event.key() >= Key_A && key_event.key() <= Key_Z)
|
&& ((key_event.key() >= Key_A && key_event.key() <= Key_Z)
|
||||||
|| (key_event.key() >= Key_0 && key_event.key() <= Key_9))) {
|
|| (key_event.key() >= Key_0 && key_event.key() <= Key_9))) {
|
||||||
|
|
||||||
if (auto* shortcut_item_indexes = m_current_menu->items_with_alt_shortcut(key_event.code_point())) {
|
if (auto* shortcut_item_indices = m_current_menu->items_with_alt_shortcut(key_event.code_point())) {
|
||||||
VERIFY(!shortcut_item_indexes->is_empty());
|
VERIFY(!shortcut_item_indices->is_empty());
|
||||||
// FIXME: If there are multiple items with the same Alt shortcut, we should cycle through them
|
// FIXME: If there are multiple items with the same Alt shortcut, we should cycle through them
|
||||||
// with each keypress instead of activating immediately.
|
// with each keypress instead of activating immediately.
|
||||||
auto index = shortcut_item_indexes->at(0);
|
auto index = shortcut_item_indices->at(0);
|
||||||
auto& item = m_current_menu->item(index);
|
auto& item = m_current_menu->item(index);
|
||||||
m_current_menu->set_hovered_index(index);
|
m_current_menu->set_hovered_index(index);
|
||||||
if (item.is_submenu())
|
if (item.is_submenu())
|
||||||
|
@ -37,10 +37,10 @@ static void print_usage_and_exit(int ret)
|
|||||||
exit(ret);
|
exit(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void add_if_not_exists(Vector<Index>& indexes, Index data)
|
static void add_if_not_exists(Vector<Index>& indices, Index data)
|
||||||
{
|
{
|
||||||
bool append_to_vector = true;
|
bool append_to_vector = true;
|
||||||
for (auto& index : indexes) {
|
for (auto& index : indices) {
|
||||||
if (index.intersects(data)) {
|
if (index.intersects(data)) {
|
||||||
if (index.m_type == Index::Type::RangedIndex) {
|
if (index.m_type == Index::Type::RangedIndex) {
|
||||||
index.m_from = min(index.m_from, data.m_from);
|
index.m_from = min(index.m_from, data.m_from);
|
||||||
@ -51,11 +51,11 @@ static void add_if_not_exists(Vector<Index>& indexes, Index data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (append_to_vector) {
|
if (append_to_vector) {
|
||||||
indexes.append(data);
|
indices.append(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void expand_list(Vector<String>& tokens, Vector<Index>& indexes)
|
static void expand_list(Vector<String>& tokens, Vector<Index>& indices)
|
||||||
{
|
{
|
||||||
for (auto& token : tokens) {
|
for (auto& token : tokens) {
|
||||||
if (token.length() == 0) {
|
if (token.length() == 0) {
|
||||||
@ -81,7 +81,7 @@ static void expand_list(Vector<String>& tokens, Vector<Index>& indexes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Index tmp = { 1, index.value(), Index::Type::RangedIndex };
|
Index tmp = { 1, index.value(), Index::Type::RangedIndex };
|
||||||
add_if_not_exists(indexes, tmp);
|
add_if_not_exists(indices, tmp);
|
||||||
} else if (token[token.length() - 1] == '-') {
|
} else if (token[token.length() - 1] == '-') {
|
||||||
auto index = token.substring(0, token.length() - 1).to_int();
|
auto index = token.substring(0, token.length() - 1).to_int();
|
||||||
if (!index.has_value()) {
|
if (!index.has_value()) {
|
||||||
@ -94,7 +94,7 @@ static void expand_list(Vector<String>& tokens, Vector<Index>& indexes)
|
|||||||
print_usage_and_exit(1);
|
print_usage_and_exit(1);
|
||||||
}
|
}
|
||||||
Index tmp = { index.value(), -1, Index::Type::SliceIndex };
|
Index tmp = { index.value(), -1, Index::Type::SliceIndex };
|
||||||
add_if_not_exists(indexes, tmp);
|
add_if_not_exists(indices, tmp);
|
||||||
} else {
|
} else {
|
||||||
auto range = token.split('-');
|
auto range = token.split('-');
|
||||||
if (range.size() == 2) {
|
if (range.size() == 2) {
|
||||||
@ -119,7 +119,7 @@ static void expand_list(Vector<String>& tokens, Vector<Index>& indexes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Index tmp = { index1.value(), index2.value(), Index::Type::RangedIndex };
|
Index tmp = { index1.value(), index2.value(), Index::Type::RangedIndex };
|
||||||
add_if_not_exists(indexes, tmp);
|
add_if_not_exists(indices, tmp);
|
||||||
} else if (range.size() == 1) {
|
} else if (range.size() == 1) {
|
||||||
auto index = range[0].to_int();
|
auto index = range[0].to_int();
|
||||||
if (!index.has_value()) {
|
if (!index.has_value()) {
|
||||||
@ -133,7 +133,7 @@ static void expand_list(Vector<String>& tokens, Vector<Index>& indexes)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Index tmp = { index.value(), index.value(), Index::Type::SingleIndex };
|
Index tmp = { index.value(), index.value(), Index::Type::SingleIndex };
|
||||||
add_if_not_exists(indexes, tmp);
|
add_if_not_exists(indices, tmp);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "cut: invalid byte or character range\n");
|
fprintf(stderr, "cut: invalid byte or character range\n");
|
||||||
print_usage_and_exit(1);
|
print_usage_and_exit(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user