4f46a97599aeb8374d4ff2b41a41edae1ce76ca5
tdreszer
  Mon Jul 25 15:28:04 2011 -0700
Replaced tdfbExtras hash with struct for efficiency. Redmine 4674.
diff --git src/hg/inc/trackDb.h src/hg/inc/trackDb.h
index 8d4b9c6..e4825f1 100644
--- src/hg/inc/trackDb.h
+++ src/hg/inc/trackDb.h
@@ -5,30 +5,33 @@
 #ifndef TRACKDB_H
 #define TRACKDB_H
 
 #include "common.h"
 
 #ifndef JKSQL_H
 #include "jksql.h"
 #endif
 
 #ifndef LINEFILE_H
 #include "linefile.h"
 #endif
 
 #define TRACKDB_NUM_COLS 21
 
+// Forward definitions
+struct tdbExtras;
+
 struct trackDb
 /* This describes an annotation track. */
     {
     struct trackDb *next;  /* Next in singly linked list.  Next sibling in tree. */
     char *track; /* Symbolic ID of Track - used in cart. Is tableName in database historically. */
     char *table; /* Symbolic ID of Table - used in database. Same as track usually. */
     char *shortLabel;	/* Short label displayed on left */
     char *type;	/* Track type: bed, psl, genePred, etc. */
     char *longLabel;	/* Long label displayed in middle */
     unsigned char visibility;	/* 0=hide, 1=dense, 2=full, 3=pack, 4=squish */
     float priority;	/* 0-100 - where to position.  0 is top */
     unsigned char colorR;	/* Color red component 0-255 */
     unsigned char colorG;	/* Color green component 0-255 */
     unsigned char colorB;	/* Color blue component 0-255 */
     unsigned char altColorR;	/* Light color red component 0-255 */
@@ -48,31 +51,31 @@
     unsigned char canPack;	/* 1 if can pack track display, 0 otherwise */
     char *settings;	/* Name/value pairs for track-specific stuff */
     struct hash *settingsHash;  /* Hash for settings. Not saved in database.
                                  * Don't use directly, rely on trackDbSetting to access. */
     /* additional info, determined from settings */
     char treeNodeType;          /* bit map containing defining supertrack, composite and children of same (may be parent & child) */
     struct trackDb *parent;     /* parent of composite or superTracks */
     struct trackDb *subtracks;  /* children of composite not supertracks */ // NOTE: can only be on one sl at a time!
     struct slRef *children;     /* children of folders (superTracks) only.  Needed as slRef since these children are on the main trackList and can't be in 2 sl's at once */
     char *parentName;           /* set if this is a supertrack member */
     boolean isShow;             /* for supertracks tracks: true if this is a supertrack with pseudo-vis 'show' */
     struct hash *overrides;     /* If not NULL, this is an override
                                  * entry.  It contains the names, but not the
                                  * values of the fields and settings that were
                                  * specified in the entry. */
-    struct hash *extras;        /* This hash allows storing extra values which may be used multiple times within a single cgi
+    struct tdbExtras *tdbExtras;/* This struct allows storing extra values which may be used multiple times within a single cgi
                                    And example is the metadata looked looked up once in the metaTbl and used again and again. */
     };
 
 #define FOLDER_MASK                      0x10
 #define COMPOSITE_MASK                   0x20
 #define MULTI_TRACK_MASK                 0x80
 #define FOLDER_CHILD_MASK                0x01
 #define COMPOSITE_CHILD_MASK             0x02
 #define COMPOSITE_VIEW_MASK              0x04
 #define MULTI_TRACK_CHILD_MASK           0x08
 #define PARENT_MASK                      0xF0
 #define CHILD_MASK                       0x0F
 #define TREETYPE_MASK                    0xFF
 #define PARENT_NODE(nodeType)            ((nodeType) & PARENT_MASK)
 #define CHILD_NODE(nodeType)             ((nodeType) & CHILD_MASK)
@@ -414,39 +417,30 @@
 /* Look for a trackDb setting from lowest level on up through chain of ancestors. */
 #endif /* OLD */
 
 char *trackDbSettingClosestToHomeOrDefault(struct trackDb *tdb, char *name, char *defaultVal);
 /* Look for a trackDb setting (or default) from lowest level on up through chain of ancestors. */
 
 boolean trackDbSettingClosestToHomeOn(struct trackDb *tdb, char *name);
 /* Return true if a tdb setting closest to home is "on" "true" or "enabled". */
 
 struct trackDb *subTdbFind(struct trackDb *parent,char *table);
 /* Return subTrack tdb if it exists in parent. */
 
 struct trackDb *tdbFindOrCreate(char *db,struct trackDb *parent,char *table);
 /* Find or creates the tdb for this table. May return NULL. */
 
-void tdbExtrasAddOrUpdate(struct trackDb *tdb,char *name,void *value);
-/* Adds some "extra" information to the extras hash.  Creates hash if necessary. */
-
-void tdbExtrasRemove(struct trackDb *tdb,char *name);
-/* Removes a value from the extras hash. */
-
-void *tdbExtrasGetOrDefault(struct trackDb *tdb,char *name,void *defaultVal);
-/* Returns a value if it is found in the extras hash. */
-
 boolean tdbIsView(struct trackDb *tdb,char **viewName);
 // Is this tdb a view?  Will fill viewName if provided
 
 char *tdbGetViewName(struct trackDb *tdb);
 // returns NULL the view name for view or child track (do not free)
 
 void parseColor(char *text, unsigned char *r, unsigned char *g, unsigned char *b);
 /* Turn comma-separated string of three numbers into three
  * color components. */
 
 int parentTdbAbandonTablelessChildren(char *db, struct trackDb *parentTdb);
 /* abandons tableless children from a container tdb, such as a composite
    returns count of children that have been abandoned */
 
 struct trackDb *trackDbLinkUpGenerations(struct trackDb *tdbList);
@@ -497,17 +491,110 @@
  * just return self. */
 
 boolean trackDbUpdateOldTag(char **pTag, char **pVal);
 /* Look for obscolete tags and update them to new format.  Return TRUE if any update
  * is done.  Will allocate fresh memory for new tag and val if updated. */
 
 boolean trackDbCheckValidRelease(char *tag);
 /* check to make sure release tag is valid */
 
 struct slName *trackDbLocalSettingsWildMatch(struct trackDb *tdb, char *expression);
 // Return local settings that match expression else NULL.  In alpha order.
 
 struct slName *trackDbSettingsWildMatch(struct trackDb *tdb, char *expression);
 // Return settings in tdb tree that match expression else NULL.  In alpha order, no duplicates.
 
+// Forward defs for tdbExtras
+struct mdbObj;
+struct _membersForAll;
+struct _membership;
+
+struct tdbExtras
+// Struct for misc. data collected/calculated during CGI track setup that are cached for later use.
+// These extras are primarily used in hgTracks & hgTrackUi but can be used and expanded as needed.
+// CGI developers are encouraged to add to this structure for their own needs.
+    {
+    int fourState; // hgTrackUi subtracks use 4 state checkboxes (checked/un by enabled/dis)
+    boolean reshapedComposite; // hgTracks should not "reshape" composites more than once.
+    struct mdbObj *mdb;        // several CGIs need repeated access to a tracks metadata
+    struct _membersForAll *membersForAll; // hgTrackUi composites collect all view/dimension info
+    struct _membership *membership;       // hgTrackUi subtracks have individual membership info
+
+    // Developer: please add your useful data that is costly to calculate/retrieve more than once
+    };
+
+#define TDB_EXTRAS_EMPTY_STATE 666
+INLINE struct tdbExtras *tdbExtrasGet(struct trackDb *tdb)
+// Returns tdbExtras struct, initializing if needed.
+{
+if(tdb->tdbExtras == NULL)
+    {
+    tdb->tdbExtras = AllocVar(tdb->tdbExtras);
+    // Initialize any values that need an "empty" state
+    tdb->tdbExtras->fourState = TDB_EXTRAS_EMPTY_STATE; // I guess it is 5 state!
+    // pointers are NULL and booleans are FALSE by default
+    }
+return tdb->tdbExtras;
+}
+
+INLINE int tdbExtrasFourState(struct trackDb *tdb)
+// Returns subtrack four state if known, else TDB_EXTRAS_EMPTY_STATE
+{
+return tdbExtrasGet(tdb)->fourState;
+}
+
+INLINE void tdbExtrasFourStateSet(struct trackDb *tdb,int fourState)
+// Sets subtrack four state
+{
+tdbExtrasGet(tdb)->fourState = fourState;
+}
+
+INLINE boolean tdbExtrasReshapedComposite(struct trackDb *tdb)
+// Returns TRUE if composite has been declared as reshaped, else FALSE.
+{
+return tdbExtrasGet(tdb)->reshapedComposite;
+}
+
+INLINE void tdbExtrasReshapedCompositeSet(struct trackDb *tdb)
+// Declares that the composite has been reshaped.
+{
+tdbExtrasGet(tdb)->reshapedComposite = TRUE;
+}
+
+INLINE struct mdbObj *tdbExtrasMdb(struct trackDb *tdb)
+// Returns mdb metadata if already known, else NULL
+{
+return tdbExtrasGet(tdb)->mdb;
+}
+
+INLINE void tdbExtrasMdbSet(struct trackDb *tdb,struct mdbObj *mdb)
+// Sets the mdb metadata structure for later retrieval.
+{
+tdbExtrasGet(tdb)->mdb = mdb;
+}
+
+INLINE struct _membersForAll *tdbExtrasMembersForAll(struct trackDb *tdb)
+// Returns composite view/dimension members for all, else NULL.
+{
+return tdbExtrasGet(tdb)->membersForAll;
+}
+
+INLINE void tdbExtrasMembersForAllSet(struct trackDb *tdb, struct _membersForAll *membersForAll)
+// Sets the composite view/dimensions members for all for later retrieval.
+{
+tdbExtrasGet(tdb)->membersForAll = membersForAll;
+}
+
+INLINE struct _membership *tdbExtrasMembership(struct trackDb *tdb)
+// Returns subtrack membership if already known, else NULL
+{
+return tdbExtrasGet(tdb)->membership;
+}
+
+INLINE void tdbExtrasMembershipSet(struct trackDb *tdb,struct _membership *membership)
+// Sets the subtrack membership for later retrieval.
+{
+tdbExtrasGet(tdb)->membership = membership;
+}
+
 #endif /* TRACKDB_H */