C_far icon

c_vector.inc 0x100

C_far | PRO | 02/23/19 01:09:15 AM UTC | 0 ⭐ | 7752 👁️ | Never ⏰ | []
Pawn |

6.63 KB

|

None

|

0 👍

/

0 👎

// EXAMPLES : https://pastebin.com/VLCGGW7c
#if defined __C_VECTOR_INCLUDED__
    #endinput
#endif
#define __C_VECTOR_INCLUDED__
#define __C_VECTOR_VERSION__ 0x100
 
#include <YSI_Coding\y_malloc>
#tryinclude <YSI_Data\y_iterate>
 
#define VECTOR_NULL                     (Vector:NO_ALLOC)
#define INVALID_VECTOR_INDEX            (cellmin)
 
enum _:E_VECTOR {
    Alloc:E_VECTOR_DATA,
    E_VECTOR_SIZE
}
 
#if defined _INC_y_iterate
 
iterfunc stock vector(&iterstate, cur, Vector:vector, array[] = cellmin, size = sizeof(array)) {
    #pragma unused cur
    if(array[0] == cellmin) {
        return vector_get_value(vector, iterstate++);
    } else {
        return vector_get_array(vector, iterstate++, array, size);
    }
}
#define iterstart@vector iterstate(INVALID_VECTOR_INDEX, 0)
 
iterfunc stock array(&iterstate, cur, const array[], size, size2 = sizeof(array)) {
    #pragma unused cur
    if(iterstate < size && iterstate < size2) {
        return array[iterstate++];
    }
    return INVALID_VECTOR_INDEX;
}
#define iterstart@array iterstate(INVALID_VECTOR_INDEX, 0)
 
#endif
 
static stock vector_push_back_ptr(&Vector:vector, &Alloc:ptr, size = 0) {
    new 
        v[E_VECTOR];
 
    if(vector == VECTOR_NULL) {
        v[E_VECTOR_DATA] = malloc(E_VECTOR, true);
        v[E_VECTOR_SIZE] = E_VECTOR;
        vector = Vector:malloc(E_VECTOR);
    } else {
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        v[E_VECTOR_SIZE] += E_VECTOR;
        new 
            Alloc:a = malloc(v[E_VECTOR_SIZE], true);
 
        memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, v[E_VECTOR_SIZE]*4, v[E_VECTOR_SIZE]);
        free(v[E_VECTOR_DATA]);
        v[E_VECTOR_DATA] = a;
    }
 
    new 
        value_ptr[E_VECTOR];
 
    ptr = value_ptr[E_VECTOR_DATA] = malloc(size, true);
    value_ptr[E_VECTOR_SIZE] = size;
 
    mseta(Alloc:vector, 0, v, E_VECTOR);
    mseta(v[E_VECTOR_DATA], v[E_VECTOR_SIZE] - E_VECTOR, value_ptr, E_VECTOR);
}
 
stock vector_push_back_value(&Vector:vector, value) {
    new 
        Alloc:ptr;
 
    vector_push_back_ptr(vector, ptr);
    mset(ptr, 0, value);
}
 
stock vector_push_back_array(&Vector:vector, const array[], size = sizeof(array)) {
    new 
        Alloc:ptr;
 
    vector_push_back_ptr(vector, ptr, size);
    mseta(ptr, 0, array, size);
}
 
stock vector_remove(&Vector:vector, index) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= E_VECTOR;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            if(index == 0 && (v[E_VECTOR_SIZE] - E_VECTOR) == 0) {
                vector_free(vector);
            } else {
                free(Alloc:mget(v[E_VECTOR_DATA] + Alloc:index, E_VECTOR_DATA));
 
                for(new i = index, j = index + E_VECTOR, value_ptr[E_VECTOR]; j < v[E_VECTOR_SIZE]; i += E_VECTOR) {
                    mgeta(value_ptr, E_VECTOR, v[E_VECTOR_DATA], j);
                    mseta(v[E_VECTOR_DATA], i, value_ptr, E_VECTOR);
                    j += E_VECTOR;
                }
 
                v[E_VECTOR_SIZE] -= E_VECTOR;
 
                new 
                    Alloc:a = malloc(v[E_VECTOR_SIZE], true);
 
                memcpy(YSI_gMallocMemory[_:a], YSI_gMallocMemory[_:v[E_VECTOR_DATA]], 0, (v[E_VECTOR_SIZE])*4, v[E_VECTOR_SIZE]);
                free(v[E_VECTOR_DATA]);
                v[E_VECTOR_DATA] = a;
 
                mseta(Alloc:vector, 0, v, E_VECTOR);
            }
 
            return true;
        }
    }
 
    return false;
}
 
stock vector_get_value(Vector:vector, index) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= 2;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            return mget(Alloc:mget(v[E_VECTOR_DATA], index), 0);
        }
    }
 
    return INVALID_VECTOR_INDEX;
}
 
stock vector_get_array(Vector:vector, index, array[], size = sizeof(array)) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= 2;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            new 
                ptr[E_VECTOR];
 
            mgeta(ptr, E_VECTOR, v[E_VECTOR_DATA], index);
 
            new 
                n_sz = ((size > ptr[E_VECTOR_SIZE]) ? ptr[E_VECTOR_SIZE] : size);
 
            mgeta(array, n_sz, ptr[E_VECTOR_DATA], 0);
 
            return n_sz;
        }
    }
 
    return INVALID_VECTOR_INDEX;
}
 
stock vector_set_value(Vector:vector, index, value) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= 2;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            mset(Alloc:mget(v[E_VECTOR_DATA], index), 0, value);
        }
    }
}
 
stock vector_set_array(Vector:vector, index, array[], size = sizeof(array)) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= 2;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            new 
                ptr[E_VECTOR];
 
            mgeta(ptr, E_VECTOR, v[E_VECTOR_DATA], index);
            if(size != ptr[E_VECTOR_SIZE]) {
                free(ptr[E_VECTOR_DATA]);
                ptr[E_VECTOR_DATA] = malloc(size, true);
                ptr[E_VECTOR_SIZE] = size;
            }
 
            mseta(ptr[E_VECTOR_DATA], 0, array, size);
            mseta(v[E_VECTOR_DATA], index, ptr, E_VECTOR);
        }
    }
}
 
stock bool:vector_is_storing_array(Vector:vector) {
    if(vector != VECTOR_NULL) {
        return mget(Alloc:mget(Alloc:vector, E_VECTOR_DATA), E_VECTOR_SIZE) != 0;
    }
 
    return false;
}
 
stock vector_free(&Vector:vector) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
    
        mgeta(v, E_VECTOR, Alloc:vector, 0);
 
        for(new i = 0; i < v[E_VECTOR_SIZE]; i += 2) {
            free(Alloc:mget(v[E_VECTOR_DATA], i));
        }
 
        free(v[E_VECTOR_DATA]);
        free(Alloc:vector);
        vector = VECTOR_NULL;
    }
}
 
stock vector_get_array_size(Vector:vector, index) {
    if(vector != VECTOR_NULL) {
        new 
            v[E_VECTOR];
 
        mgeta(v, E_VECTOR, Alloc:vector, 0);
        index *= 2;
 
        if(0 <= index < v[E_VECTOR_SIZE]) {
            return mget(Alloc:v[E_VECTOR_DATA], E_VECTOR_SIZE);
        }
    }
 
    return 0;
}
 
stock vector_get_size(Vector:vector) {
    if(vector != VECTOR_NULL) {
        return (mget(Alloc:vector, E_VECTOR_SIZE) / E_VECTOR);
    }
 
    return 0;
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎