gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

pobjlist.cxx (2533B)


      1 /*
      2  *
      3  *  C++ Portable Types Library (PTypes)
      4  *  Version 2.1.1  Released 27-Jun-2007
      5  *
      6  *  Copyright (C) 2001-2007 Hovik Melikyan
      7  *
      8  *  http://www.melikyan.com/ptypes/
      9  *
     10  */
     11 
     12 #include "ptypes.h"
     13 
     14 
     15 namespace ptypes {
     16 
     17 
     18 _objlist::_objlist()
     19     : tpodlist<void*,true>()
     20 {
     21     memset(&config, 0, sizeof(config));
     22 }
     23 
     24 
     25 _objlist::_objlist(bool ownobjects)
     26     : tpodlist<void*,true>()
     27 {
     28     memset(&config, 0, sizeof(config));
     29     config.ownobjects = ownobjects;
     30 }
     31 
     32 
     33 _objlist::~_objlist()
     34 {
     35 }
     36 
     37 
     38 void _objlist::dofree(void*)
     39 {
     40     fatal(CRIT_FIRST + 38, "ptrlist::dofree() not defined");
     41 }
     42 
     43 
     44 int _objlist::compare(const void*, const void*) const
     45 {
     46     fatal(CRIT_FIRST + 38, "ptrlist::compare() not defined");
     47     return 0;
     48 }
     49 
     50 
     51 void _objlist::dofree(int index, int num)
     52 {
     53     void** p = (void**)list + index;
     54     while (--num >= 0)
     55         dofree(*p++);
     56 }
     57 
     58 
     59 void _objlist::doput(int index, void* obj)
     60 {
     61     void** p = (void**)list + index;
     62     if (config.ownobjects)
     63         dofree(*p);
     64     *p = obj;
     65 }
     66 
     67 
     68 void _objlist::dodel(int index)
     69 {
     70     if (config.ownobjects)
     71         dofree(doget(index));
     72     tpodlist<void*, true>::dodel(index);
     73 }
     74 
     75 
     76 void _objlist::dodel(int index, int delcount)
     77 {
     78     if (config.ownobjects)
     79     {
     80         if (index + delcount > count)
     81             delcount = count - index;
     82         dofree(index, delcount);
     83     }
     84     tpodlist<void*, true>::dodel(index, delcount);
     85 }
     86 
     87 
     88 void _objlist::set_count(int newcount)
     89 {
     90     if (newcount < count && config.ownobjects)
     91     {
     92         if (newcount < 0)
     93             newcount = 0;
     94         dofree(newcount, count - newcount);
     95     }
     96     _podlist::set_count(newcount, true);
     97 }
     98 
     99 
    100 void* _objlist::dopop()
    101 {
    102     void* t = doget(--count);
    103     if (count == 0)
    104         set_capacity(0);
    105     return t;
    106 }
    107 
    108 
    109 bool _objlist::search(const void* key, int& index) const
    110 {
    111     int l, h, i, c;
    112     bool ret = false;
    113     l = 0;
    114     h = count - 1;
    115     while (l <= h) 
    116     {
    117         i = (l + h) / 2;
    118         c = compare(key, doget(i));
    119         if (c > 0)
    120             l = i + 1;
    121         else 
    122         {
    123             h = i - 1;
    124             if (c == 0) 
    125             {
    126                 ret = true;
    127                 if (!config.duplicates)
    128                     l = i;
    129             }
    130         }
    131     }
    132     index = l;
    133     return ret;
    134 }
    135 
    136 
    137 int _objlist::indexof(void* obj) const
    138 {
    139     for (int i = 0; i < count; i++)
    140         if (doget(i) == obj)
    141             return i;
    142     return -1;
    143 }
    144 
    145 
    146 #ifdef PTYPES19_COMPAT
    147 
    148 objlist::objlist(bool ownobjects): tobjlist<unknown>(ownobjects)  {}
    149 
    150 objlist::~objlist()  {}
    151 
    152 #endif
    153 
    154 
    155 }
    156