vJass модуль list

Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
cJass
Тип:
Наработка
Модуль небольшой, который вывел из модуля дока, за что credits ему.
Использует interface теперь, и теперь можно запускать хоть методы, хоть функции вне него, короче как вам удобнее.
Также добавил пример использования функции.
Какие приемущества перед другими модулями?
  1. Невесомый, и может использоваться абсолютно в любой структуре, даже не в спеллах
  2. Можно использовать в структуре которая может инициилизировать несколько спеллов (грубо говоря у вас одна структура на все тригерные магии)
vJass
function interface push takes integer this returns nothing defaults nothing
//! nocjass
module list
    readonly static thistype array data
    readonly static integer count = 0
    boolean flush = false
    push    press

    method add takes nothing returns nothing
        set thistype.data[thistype.count] = this
        set thistype.count = thistype.count + 1
    endmethod
    
    method remove takes integer i returns nothing
        set thistype.count  = thistype.count - 1
        set thistype.data[i] = thistype.data[thistype.count]
    endmethod

    static method update takes nothing returns nothing
        local integer i = 0
        loop
            exitwhen i==thistype.count
            if thistype.data[i].flush then
                 call thistype.data[i].destroy()
                 call thistype.data[i].remove(i)
                 set i = i - 1
            else
                call thistype.data[i].press(thistype.data[i]).evaluate()
            endif
            set i = i + 1
        endloop
    endmethod

endmodule
//! endnocjass
cJass
function interface push takes integer this returns nothing defaults nothing
define <implement list>={
    readonly static thistype data[]
    readonly static integer count = 0
    boolean flush = false
    push     press
   
    nothing add(){thistype.data[thistype.count++] = this}
        
    nothing remove(integer i){thistype.data[i] = thistype.data[--thistype.count]}
        
    static nothing update(){
        integer i = 0
        whilenot(i == thistype.count){
        if (thistype.data[i].flush){
           thistype.data[i].destroy()
           thistype.data[i].remove(i--)
        } else {thistype.data[i].press(thistype.data[i]).evaluate()}i++}}
    }
}
Ну и собственно пример.
struct spell
    static timer tt=CreateTimer()
    unit cast
    unit targ
    real time
    implement list
endstruct

function onTimer takes spell this returns nothing
    set this.time = this.time - 0.04
    if this.time < 0.04 then
         if GetWidgetLife(this.targ)>.405 or GetWidgetLife(this.cast)>.405 then
             call SetUnitX(this.targ,GetUnitX(this.cast))
             call SetUnitY(this.targ,GetUnitY(this.cast))
         endif
         call this.remove(this)
         call this.destroy()
         if spell.count == 0 then
             call PauseTimer(spell.tt)
         endif
    endif
endfunction

function Cast takes nothing returns nothing
    local spell this = spell.create
    set this.cast = GetTriggerUnit()
    set this.targ = GetSpellTargetUnit()
    set this.time = GetUnitAbilityLevel(this.cast,GetSpellAbilityId())
    set this.push = onTimer
    call this.add()
    if spell.count==0 then
        call TimerStart(spell.tt,0.04,true,function this.update)
    endif
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
24
12 лет назад
0
. Я вызову функцию 60 раз, мой метод, будет оперативно быстрее, как в плане кода, так и в плане обработки, тем более у меня практически не будет возможности заполнить канал, и мне не придётся экзекать новый.
o\ Твой код будет существенно медленнее. В промышленных языках, вызов одной функции, соизмеримо выполнении ~ 10 "базовых" инструкций.
Т.е. 300 строк кода, существенно быстрее 60 вызовов функций, в которых хранится 5 инструкций. Причем сам вызов будет больше жрать процессорного времени, чем исполнение.
тем более у меня практически не будет возможности заполнить канал, и мне не придётся экзекать новый.
Если ты не будешь экзекутить каждую функцию, то обычный вызов функции не будет создавать новый тред, следственно в твоем случае поток быстрее кончится :nate:
твой юзер дата - 20 таймеров пускать будет
Ну ты тупой o\ Юзер дата присваивает индексы объекту, никаких таймеров эта либа не создает.
Ну короче все ясно, ты нуб и не шаришь, видимо даже код не смотрел, раз порешь какую то чушь.
0
37
12 лет назад
0
А вы не знали, что внутрь таймера можно крепить число?
0
24
12 лет назад
0
У меня юзер дата для любых объектов, по этому не особо актуально.
я уже не говорю о том, что реализация конкретного темплейта не относится к дискусу, т.к. это лишь простенький пример, для демонстрации концепции. И в самом темплейте можно реализовать любую архитектуру, хоть цеплять значение на таймер, хоть юзать мейнтаймер, и тд. Факт остается фактом, что быстрее правильного темплейта ничего не может быть, т.к. любой подход реализуется через темплейты.
ScorpioT1000:
А вы не знали, что внутрь таймера можно крепить число?
Собсно знал, вроде бы как раз ты упоминал об этом давно. Однако не особо интересен данный костыль. Я очень сомневаюсь, что метод работает быстрее чем типичный аттач через хт.
0
37
12 лет назад
0
Я очень сомневаюсь, что метод работает быстрее чем типичный аттач через хт.
Кончился чтоли? =)
0
24
12 лет назад
0
ScorpioT1000, пруф?
0
37
12 лет назад
0
Это твой оффер, ты должен предоставить пруфы.
0
24
12 лет назад
0
Я не сказал, что он точно быстрее, я лишь высказал сомнение(сомнение != утверждение), но ты его опроверг. Опровержение => утверждение => ты и должен предоставить пруфы.
0
37
12 лет назад
0
Если ты отрицаешь очевидное, то это твой оффер.
0
24
12 лет назад
0
Сомнение != отрицание ._.
Проще говоря, нет ты=)
1
19
12 лет назад
Отредактирован Nerevar
1
Faion:
ты так и не ответил, к чему ты будешь крепить UserData своей структуры при цикличном выполнении функции. Опять позоришься, я уже понял что ты [вырезано] и готов опозориться посредственными знаниями включая это.
Faion:
o\ Твой код будет существенно медленнее. В промышленных языках, вызов одной функции, соизмеримо выполнении ~ 10 "базовых" инструкций.
Т.е. 300 строк кода, существенно быстрее 60 вызовов функций, в которых хранится 5 инструкций. Причем сам вызов будет больше жрать процессорного времени, чем исполнение.
Ты смотришь на байты, а я смотрю на общее количество запускаемого дерьма получаемого в итоге.
3 пункта от Nerevar: 2.1 (оскорбление)
0
24
12 лет назад
0
У тебя рак мозга? Повторяю для особо одаренных, юзер дата не имеет никакого отношения к концепции шаблонов. То что в конкретном примере используется она, это лишь частный случай, там могут использовать любые алгоритмы.
Ты смотришь на байты, а я смотрю на общее количество запускаемого дерьма получаемого в итоге.
Как раз на байты смотришь ТЫ. Я смотрю на процессорное время.
Ну короче кг\ам
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.