vlib



  • GPC schrieb:

    verfluchter sort-algo 😡

    du baust nicht zufällig auch nen sort-algo für arrays?



  • version 0.011 (noch recht unsauber und zum teil sind die unten gesagten sachen doch noch noch nicht drin). http://volkard.de/vhlib.tar.bz2

    für Array und Vector gilt:
    wenn ANZAHL>0, dann
    Array<int,ANZAHL,false> a;//ANZAHL ints auf dem stack (bzw im objekt)
    Array<int,ANZAHL,true> a;//ANZAHL ints auf dem freispeicher
    Array<int,ANZAHL> a;//ANZAHL ints auf dem freispeicher, falls
    //ANZAHL*sizeof(int)>4096
    wenn ANZAHL==0, dann
    Array<int,0> a(10);//10 ints auf dem heap.
    Array<int> a(10);//10 ints auf dem heap.
    außerdem hat Array/Vector nur dann einen zuweisungsoperator, wenn die daten
    auf dem freispeicher liegen. wegen exceptionsicherheit. nen copy-ctor gibts
    immer.

    Queue wurde von MrN gebaut.

    auch betriebssysteme ohne strerror_r wie FreeBSD compilieren jetzt.

    linux wurde umgenannt nach default und statt #ifdef __linux__ steht jetzt
    #else. falls mal linux und bsd gespalten werden müßten, kann man das besser
    möglichst spät machen.

    klasse StringLiteral erstmal wieder fallengelassen. ist zu unpraktisch. kommt
    wohl erst wieder, wenn unicode oder utf8 anstehen.

    osImpl.hpp benutzt kein using namespace os mehr. sie ist ja immerhin auch
    nur ne hpp.

    swap ist nur noch für typen gültig, für die es explizit gesagt wurde.

    alle iteratoren werden range-checked.

    komplettes rewrite von Array.

    assert.hpp
    assert und ASSERT in ASSERT und STATIC_ASSERT geändert.
    CHECK gebaut. ist wie assert, aber wird immer ausgewertet.
    also bei CHECK(CloseHandle(file)!=INVALID_HANDLE_VALUE) wird auch
    nach #define NDEBUG das CloseHandle(file) aufgerufen, aber dann wird
    nicht getestet, ob es funktionierte.

    FileReader.hpp
    FileReader gebaut.

    Vector.hpp
    Vector gebaut. Vector ist da, damit man ihn als allocator benutzt und damit
    objekte hineinerzeugt. der speicher ist in einem stück. er hat einen schnellen
    Iterator. beim wachsen kopiert er um. vector ist kein array-ersatz, womit ich
    mich von der üblichen stl-verwendung unterscheide. dafür gibt es hier Array.

    swap.hpp
    funtion swap in ne eigene datei getan.

    FileWriter.hpp
    FileWriter gebaut.
    wenn nicht sicher ist, daß das schreiben klappt, und wenn so ein schreibfehler
    gefangen werden soll, muß man per hand am ende flush() aufrufen, damit
    keine exception im dtor fliegen kann.



  • Woher kommt eigentlich der vielsagende Name vhlib?



  • dali schrieb:

    Woher kommt eigentlich der vielsagende Name vhlib?

    Ist wahrscheinlich ein Kürzel für Volkard Henkel Library 😕
    Der Name entstand wahrscheinlich aus Mangel an weiterer Fantasie :p 😉



  • Jeap wäre naheliegend 😃



  • Caipi schrieb:

    dali schrieb:

    Woher kommt eigentlich der vielsagende Name vhlib?

    Ist wahrscheinlich ein Kürzel für Volkard Henkel Library 😕
    Der Name entstand wahrscheinlich aus Mangel an weiterer Fantasie :p 😉

    stimmt beides.
    vielleicht sollte ich sie in "vlib" umnennen? klingt viel fantasievoller, gell?
    so. http://volkard.de/vlib.tar.bz2 (iteratoren von vector und array endlich sind alle range-checked.)



  • volkard denkt ans heiraten.



  • volkard schrieb:

    GPC schrieb:

    verfluchter sort-algo 😡

    du baust nicht zufällig auch nen sort-algo für arrays?

    Sorry dass ich das erst jetzt lese, hab das irgendwie übersehen.
    Momentan bastel ich noch am QuickSort und Mergesort für meine LinkedList.
    Ich hätte zwar durchaus Interesse einen für Arrays zu schreiben(bräuchte selber mal einen), allerdings müsste ich mir erstmal deine vhlib genau ansehen, wie sie aufgebaut ist, dein Design, entsprechende Konventionen usw. . Wenn ich dann meine, ich wäre gut genug um einen guten algo zu schreiben, hätte ich schon lust dazu.

    //EDIT: Dauert dir aber wohl zu lange, bis ich da fertig wär.



  • GPC schrieb:

    allerdings müsste ich mir erstmal deine vhlib genau ansehen, wie sie aufgebaut ist, dein Design, entsprechende Konventionen usw.

    template<typename Iterator>
    void sort(Iterator begin,Iterator end);
    

    allerdings sofort probleme, denn die iteratoren können noch nicht zum beispiel op+(Iterartir,Size). das müßte dann nachgerüctet werden.

    Dauert dir aber wohl zu lange, bis ich da fertig wär.

    kann man nicht wissen. ich brauche noch keinen. wenn ich einen brauche, schreib ich halt einen. wenn du vorher einen hast, sag bescheid.



  • mkdir .outMakefile
    echo keep > .outMakefile/keep
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/credits.o -MD credits.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileReader.o -MD FileReader.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileWriter.o -MD FileWriter.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/iostream.o -MD iostream.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/main.o -MD main.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/os.o -MD os.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/prime.o -MD prime.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/PrimeGenerator.o -MD PrimeGenerator.cpp
    In file included from Array.hpp:5,
                     from PrimeGenerator.hpp:4,
                     from PrimeGenerator.cpp:1:
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size)':
    RawArray.hpp:19: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss
    RawArray.hpp:19: Fehler: (mit »-fpermissive« wird G++ den Code akzeptieren, aber die Verwendung eines nicht deklarierten Namens ist veraltet)
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size,  true>::operator[](Size)':
    RawArray.hpp:39: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, 0ul,  true>::operator[](Size)':
    RawArray.hpp:62: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size)':
    RawArray.hpp:143: Fehler: es gibt keine Argumente für »ASSERT«, die von einem Templateparameter abhängen, weshalb eine Deklaration von »ASSERT« verfügbar sein muss
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap =  false]':
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap =  false]'
    PrimeGenerator.hpp:71:   instantiated from here
    RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp:143: Fehler: (Jeder nicht deklarierte Bezeichner wird nur einmal für jede Funktion, in der er vorkommt, gemeldet.)
    swap.hpp: In function `void swap(Data&, Data&) [with Data = Size]':
    Stack.hpp:52:   instantiated from `void swap(Stack<PrimeGenerator::Runner>&, Stack<PrimeGenerator::Runner>&)'
    PrimeGenerator.hpp:95:   instantiated from here
    swap.hpp:6: Fehler: Abfrage des Elementes »swap« in »a«, das vom Nicht-Klassentyp »long unsigned int« ist
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = PrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap =  false]':
    Stack.hpp:36:   instantiated from `Data& Stack<Data>::peek() const [with Data = PrimeGenerator::Runner]'
    PrimeGenerator.hpp:97:   instantiated from here
    RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap =  false]':
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap =  false]'
    PrimeGenerator.hpp:132:   instantiated from here
    RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = BigPrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap =  false]':
    Stack.hpp:36:   instantiated from `Data& Stack<Data>::peek() const [with Data = BigPrimeGenerator::Runner]'
    PrimeGenerator.hpp:158:   instantiated from here
    RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 16384u, bool onHeap =  false]':
    RawArray.hpp:144:   instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap =  false]'
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<PrimeGenerator::Runner>, long unsigned int size = 16384u, bool onHeap =  false]'
    PrimeGenerator.hpp:71:   instantiated from here
    RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap =  false]':
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap =  false]'
    BitField.hpp:24:   instantiated from `void BitField<size>::set(Size) [with long unsigned int size = 16384u]'
    PrimeGenerator.hpp:86:   instantiated from here
    RawArray.hpp:143: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 255ul, bool onHeap =  false]':
    RawArray.hpp:144:   instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = PrimeGenerator::Runner, long unsigned int size = 255ul, bool onHeap =  false]'
    Stack.hpp:36:   instantiated from `Data& Stack<Data>::peek() const [with Data = PrimeGenerator::Runner]'
    PrimeGenerator.hpp:97:   instantiated from here
    RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<16ul, 8ul>, long unsigned int size = 1048576u, bool onHeap =  false]':
    RawArray.hpp:144:   instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap =  false]'
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = Stack<BigPrimeGenerator::Runner>, long unsigned int size = 1048576u, bool onHeap =  false]'
    PrimeGenerator.hpp:132:   instantiated from here
    RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    RawArray.hpp: In member function `RawObject& RawArrayMemory<RawObject, size, onHeap>::operator[](Size) [with RawObject = AlignedMemory<4ul, 4ul>, long unsigned int size = 514ul, bool onHeap =  false]':
    RawArray.hpp:144:   instantiated from `Data& RawArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap =  false]'
    Array.hpp:18:   instantiated from `Data& ArrayImpl<Data, size, onHeap>::operator[](Size) [with Data = u32, long unsigned int size = 514ul, bool onHeap =  false]'
    BitField.hpp:24:   instantiated from `void BitField<size>::set(Size) [with long unsigned int size = 16384u]'
    PrimeGenerator.hpp:86:   instantiated from here
    RawArray.hpp:19: Fehler: »ASSERT« nicht deklariert (erste Verwendung dieser Funktion)
    make: *** [.outMakefile/PrimeGenerator.o] Fehler 1
    

    😃 (Ach wie hassen wir doch alle kryptische template-fehler)



  • füg doch mal include "assert.hpp" hinzu...



  • > tar xjf vlib.tar.bz2
    > cd vlib
    > make
    mkdir .outMakefile
    echo keep > .outMakefile/keep
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp
    cc1plus: warnings being treated as errors
    Error.hpp:6: Warnung: ‘class Error’ has virtual functions but non-virtual destructor
    assert.cpp:4: Warnung: ‘class AssertError’ has virtual functions but non-virtual destructor
    make: *** [.outMakefile/assert.o] Fehler 1
    
    template<typename RawObject,Size size,bool onHeap>
    

    Warum benutzt du dieses bool-Flag? Finde ich

    (a) nicht sonderderlich verständlich. Wenn jemand nun so etwas sieht und die vlib nicht kennt, dann weiß er nicht was es bedeutet

    Array<int,10,true> a;
    

    (b) was ist wenn man nun in Shared Memory oder in irgend einem spezial Speicher allokieren will, daher würde ich wie in der stdlib Allokatoren vorziehen.



  • DrGreenthumb schrieb:

    füg doch mal include "assert.hpp" hinzu...

    in RawArray.hpp?
    ist drin. seit ner stunde afair.

    ach, wie ich das hasse, daß der eine compiler das durchläßt und der andere da nen fehler meldet.



  • volkard schrieb:

    DrGreenthumb schrieb:

    füg doch mal include "assert.hpp" hinzu...

    in RawArray.hpp?
    ist drin. seit ner stunde afair.

    ach, wie ich das hasse, daß der eine compiler das durchläßt und der andere da nen fehler meldet.

    hehe, mach mal einen monotone oder svn server auf 🙂

    btw. für welchen Compiler testest du? GCC 4?



  • kingruedi schrieb:

    Error.hpp:6: Warnung: ‘class Error’ has virtual functions but non-virtual destructor

    klarer programmierfehler. ist raus.

    template<typename RawObject,Size size,bool onHeap>
    

    Warum benutzt du dieses bool-Flag? Finde ich
    (a) nicht sonderderlich verständlich. Wenn jemand nun so etwas sieht und die vlib nicht kennt, dann weiß er nicht was es bedeutet

    die vlib soll nicht nur replacement der standardlib sein, sondern ein paar sachen schon anders machen. da flag wird schon ein wenig deutlicher bei

    template<typename Data,Size size=0,bool onHeap=size==0>
    class Array...
    

    ich will, daß ein Array mit echt vielen elementen ganz von allein auf dem heap liegt und ein kleies Array ganz von allein auf dem stack. das war bei std::vector immer ein großes argernis, daß der zwingend new benutzt und entsprechend langsam für kleine mengen ist.

    Array<int,10,true> a;
    

    normalerweise schreibt der benutzer ja

    Array<int,10> a;
    

    und benutzt das flag eher nie.

    (b) was ist wenn man nun in Shared Memory oder in irgend einem spezial Speicher allokieren will, daher würde ich wie in der stdlib Allokatoren vorziehen.

    ich habe noch nie std::vector zusammen mit einem eigenen allokator verwendet. hab die allokatoren erstmal vertagt. mus noch viel besser werden, um die gescheit hinzukriegen. aber bedarf ist schon da. der primzahlenzähler ist mit eigenem allokator 20% schneller.



  • kingruedi schrieb:

    hehe, mach mal einen monotone oder svn server auf 🙂

    theoretisch hab ich ja einen. muß mir mal erzählen lassen, wie man sowas verwendet.

    btw. für welchen Compiler testest du? GCC 4?

    windows: ms toolkit 2005
    windows: mingw (gcc 3.4.2)
    linux: gcc 3.3.5-20050130



  • Bei mir gehts immer noch nicht...

    mkdir .outMakefile
    echo keep > .outMakefile/keep
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/assert.o -MD assert.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/credits.o -MD credits.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileReader.o -MD FileReader.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/FileWriter.o -MD FileWriter.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/iostream.o -MD iostream.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/main.o -MD main.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/os.o -MD os.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/prime.o -MD prime.cpp
    g++  -Wall -Werror -pipe -fno-rtti -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs -fmerge-all-constants -c -o .outMakefile/PrimeGenerator.o -MD PrimeGenerator.cpp
    swap.hpp: In function `void swap(Data&, Data&) [with Data = Size]':
    Stack.hpp:52:   instantiated from `void swap(Stack<PrimeGenerator::Runner>&, Stack<PrimeGenerator::Runner>&)'
    PrimeGenerator.hpp:95:   instantiated from here
    swap.hpp:6: Fehler: Abfrage des Elementes »swap« in »a«, das vom Nicht-Klassentyp »long unsigned int« ist
    make: *** [.outMakefile/PrimeGenerator.o] Fehler 1
    

    Mit meinem i386-pc-linux-gnu-g++ gehts übrigens. Wird wohl was mit der größe von datentypen z tun haben...



  • ness schrieb:

    Bei mir gehts immer noch nicht...

    jup. momentchen.



  • jetzt müßte es gehen.
    lag an den datentypen.
    weil ich swap nicht mehr für alle typen angeboten hab, sondern nur noch explizit angebe, was geswapped werden kann, und weil ich swap für unsigned long noch nicht hatte, konnte er bei dir Size nicht swappen.



  • kingruedi schrieb:

    hehe, mach mal einen monotone oder svn server auf 🙂

    eigentlich würde ein script um wget reichen, das bescheidsagt, wenn sich die vhlib.tar.bz geändert hat.


Anmelden zum Antworten