AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Snippets and Tutorials (https://forums.alliedmods.net/forumdisplay.php?f=112)
-   -   [INC] Queue - FIFO (https://forums.alliedmods.net/showthread.php?t=319495)

JoinedSenses 11-03-2019 23:04

[INC] Queue - FIFO
 
Based on some discussion via SM discord, I created a queue methodmap which inherits from Handle and utilizes arraylist methods. Unlike ArrayStack, this methodmap is First In, First Out.

Code can be found here:
queue.inc

Simple example usage:

Code:

#include <sourcemod>
#include <queue>

public void OnPluginStart() {
        RegAdminCmd("sm_test", cmdTest, ADMFLAG_ROOT);
}

public Action cmdTest(int client, int args) {
        Queue q = new Queue();

        for (int i = 1; i <= 10; i++) {
                q.Push(i);       
        }

        while (!q.Empty) {
                ReplyToCommand(client, "%i", q.Pop());
        }

        delete q;

        return Plugin_Handled;
}


Bara 11-04-2019 13:13

Re: [INC] Queue - FIFO
 
Thanks, will be useful for some stuff.

HelpMe 10-29-2020 07:36

Re: [INC] Queue - FIFO
 
Sadly pop is still O(n).

MAGNAT2645 10-29-2020 17:50

Re: [INC] Queue - FIFO
 
Quote:

Originally Posted by HelpMe (Post 2722962)
Sadly pop is still O(n).

Queue is based on ArrayList so it's not surprising.

JoinedSenses 01-23-2021 15:34

Re: [INC] Queue - FIFO
 
SM doesnt have LinkedList

wopox3 01-27-2021 15:34

Re: [INC] Queue - FIFO
 
accept please https://github.com/JoinedSenses/SM-Queue/pull/2

kossolax 03-31-2021 07:24

Re: [INC] Queue - FIFO
 
Quote:

Originally Posted by JoinedSenses (Post 2733976)
SM doesnt have LinkedList

This is not tested, but would be more smart for O(1) push & pop at the cost of some more memory usage (using circular buffer)


PHP Code:

methodmap Queue Handle {
    public 
Queue(int size=32) {
        
ArrayList data = new ArrayList(1size+3);
        
data.Set(00);        // tail
        
data.Set(10);        // head
        
data.Set(2size);    // Size
        
return view_as<Queue>(data);
    }
    
    
property int Tail {
        public 
get() { return view_as<ArrayList>(this).Get(0); }
        public 
set(const int value) { view_as<ArrayList>(this).Set(0value); }
    }
    
property int Head {
        public 
get() { return view_as<ArrayList>(this).Get(1); }
        public 
set(const int value) { view_as<ArrayList>(this).Set(1value); }
    }
    
property int Size {
        public 
get() { return view_as<ArrayList>(this).Get(2); }
    }
    
// ----
    
property bool isEmpty {
        public 
get() { return this.Head == this.Tail; }
    }
    
property bool isFull {
        public 
get() { return ((this.Head+1)%this.Size) == this.Tail; }
    }
    
// ----
    
public void Push(const int value) {
        
view_as<ArrayList>(this).Set(this.Head+3value);
        
this.Head = (this.Head 1) % this.Size;
    }
    public 
int Pop() {
        
int tmp view_as<ArrayList>(this).Get(this.Tail+3);
        
this.Tail = (this.Tail 1) % this.Size;
        return 
tmp;
    }
    public 
int Front() {
        return 
view_as<ArrayList>(this).Get(this.Tail+3);
    }




All times are GMT -4. The time now is 18:40.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.