#ifndef __SPECACHE_HPP_
#define __SPECACHE_HPP_

#include "specs.hpp"


class spec_directory_cache
{
  class filename_node
  {
    public :
    filename_node *left,*right,*next;
    char *fn;
    spec_directory *sd;
    char *filename() { return fn; }
    filename_node(char *filename, spec_directory *dir)
    {
      fn=(char *)memcpy(jmalloc(strlen(filename)+1,"spec_dir cache"),filename,strlen(filename)+1);
      sd=dir;
      next=left=right=0;      
    }
    ~filename_node()
    {
      jfree(fn);
      delete sd;
    }

    long size;
  } *fn_root,*fn_list;
  void clear(filename_node *f); // private recursive member  
  long size;
  public :
  spec_directory *get_spec_directory(char *filename, bFILE *fp=NULL);
  spec_directory_cache() { fn_root=0; size=0; }
  void clear();                             // frees up all allocated memory
  void load(bFILE *fp);
  void save(bFILE *fp);
  ~spec_directory_cache() { clear(); }
} ;

extern spec_directory_cache sd_cache;

#endif
