[fpc-pascal] TSortedCollection dupes ordering

waldo kitty wkitty42 at windstream.net
Wed Feb 5 01:30:11 CET 2014


On 2/4/2014 5:16 PM, Frederic Da Vitoria wrote:
> 2014-02-04 waldo kitty <wkitty42 at windstream.net <mailto:wkitty42 at windstream.net>>:
[...]
>     i kinda thought about that earlier when i was digging thru the code... IIRC,
>     insert was overridden because there are cases where the existing record
>     needs to be replaced (because the new record is newer) using AtPut and the
>     non-added records must be logged and their reason for not being added (older
>     or same)...
>
>
> Just a quick idea which could be completely wrong, but wouldn't it solve your
> issue if Compare always returned -1 instead of 0?

no, because i lose (at least) the logging of why the record was tossed out... 
see below... it wouldn't help with the duplicate keys being inserted in reverse 
order...

Procedure TTLEColl.Insert(Item: Pointer);

var
   I   : Sw_Integer = 0;
   old : Pointer;
   foo : integer = 0;

begin
   I := 0;
   If NOT Search(KeyOf(Item), I) OR Duplicates Then  // Item valid
     begin
       logTLEEntryType('M');                         // MERGE this TLE
       AtInsert(I, Item);                            // Insert the item
//      Insert(Item);                                 // Insert the item
       inc(cur_TLEs_added);                          // increment the add counter
     end
   else                                              // otherwise
     begin
       foo := CompareReal(PTLERec(At(i))^.epoch,PTLERec(Item)^.epoch); // 
compare the epochs
       case foo of
         -1 : begin                                  // replace existing record
                logTLEEntryType('U');                // UPDATE this entry
                old := At(i);                        // save existing pointer first!
                AtPut(i, Item);                      // now put in the new record
                dispose(PTLERec(old),done);          // dispose old one
                inc(cur_TLEs_updtd);                 // increment the updated 
counter
              end;
          0 : begin                                  // we're tossing this one out
                logTLEEntryType('S');                // this entry is the SAME
                dispose(PTLERec(Item),done);         // dispose the item
                inc(cur_TLEs_same);                  // increment the same counter
              end;
          1 : begin                                  // we're tossing this one out
                logTLEEntryType('N');                // the existing entry is NEWER
                dispose(PTLERec(Item),done);         // dispose the item
                inc(cur_TLEs_old);                   // increment the old counter
              end;
         end; // case
     end;
end;


-- 
NOTE: No off-list assistance is given without prior approval.
       Please keep mailing list traffic on the list unless
       private contact is specifically requested and granted.



More information about the fpc-pascal mailing list