Referenz-Counting von Farbpaaren



  • Hallo.

    Ich benutze ncurses und da muss man mit init_pair() einen short als Identifier für ein Farbpaar(fg, bg) definieren. Das ganze wollte ich c++ig machen. Und das hab ich gemacht, aber ich finde die Lösung nicht top. Vielleicht die falsche Datenstruktur ausgewählt? Wenn ja, welche wäre denn adäquater? Ich mach einmal for-Schleife und dann (falls keine ID vorhanden ist) immer doppelte for-Schleife. Das Ganze scheint mir etwas merkwürdig, normalerweise müsste man das doch performanter hinbekommen. Ich will mal Code zeigen:

    struct color_type{
            static std::vector<std::pair<color_pair, short>> ids;
    
            color_pair cp;
            short id;
    
            static short get_id(color_pair c){
                for(const auto& id : ids){
                    if(id.first == c)
                        return id.second;
                }
    
                for(short value{1}; value!=std::numeric_limits<short>::max(); ++value){
                    if(std::find_if(ids.begin(), ids.end(), [value](const std::pair<color_pair, short>& v){
                        return v.second == value;
                    }) == ids.end())
                    {
                        init_pair(value, (short)c.foreground, (short)c.background);
                        return value;
                    }
                }
    
                throw std::runtime_error{"No space left for color pair"};
            }
    
        public:
            color_type(color_pair c)
                : cp{c}, id{get_id(c)} {}
        };
    

    Der Code funktioniert natürlich. Aber was mach ich denn sonst noch falsch?



  • $thread.top();

    Irgendein Kommentar zu meinem Code?



  • Verstehe ich das richtig, daß es keine doppelten Identifier ('value')-Einträge geben soll?
    Warum verwendest du dann keine std::map bzw. bimap, wie z.B. Boost.Bimap?

    Ich persönlich würde mir auch einfach den höchsten Identifier einmalig heraussuchen (und in einer Membervariablen merken) und dann einfach diesen Index erhöhen (wenn du dann mehr als numeric_limits<short>::max() Werte benötigst, dann hast du sowieso ein Problem).



  • mimsi schrieb:

    $thread.top();

    Irgendein Kommentar zu meinem Code?

    Wieso "natürlich"? Wieso "falsch"? Du sagst nicht, was genau das alles soll, wieso du es nicht top findest usw., verlangst aber, dass jemand sich im Kaffeesatzlesen versucht.



  • Th69 schrieb:

    Verstehe ich das richtig, daß es keine doppelten Identifier ('value')-Einträge geben soll?
    Warum verwendest du dann keine std::map bzw. bimap, wie z.B. Boost.Bimap?

    Ja, könnt ich machen, müsste dann trotzdem aber noch über alle Einträge iterieren, um eine freie ID zu bekommen oder nicht? Wobei, die ID's werden sowieso bis zum Programm-Ende nicht mehr aus der Liste rausgeholt, ergo ich kann einfach map.size() zur Identifizierung nutzen, gut.

    Ich persönlich würde mir auch einfach den höchsten Identifier einmalig heraussuchen (und in einer Membervariablen merken) und dann einfach diesen Index erhöhen (wenn du dann mehr als numeric_limits<short>::max() Werte benötigst, dann hast du sowieso ein Problem).

    Stimmt. Ich mach einfach HOECHSTER_WERT*HOECHSTER_WERT.

    Wieso "natürlich"? Wieso "falsch"?

    Weder noch.

    Du sagst nicht, was genau das alles soll

    Steht im Titel

    wieso du es nicht top findest usw.

    Sagte ich schon. Zu viele for-Schleifen für meinen Geschmack.


Anmelden zum Antworten