/// <summary>
 /// Adds a template to a specified location.  Replaces an existing template.
 /// </summary>
 /// <param name="template">the template value</param>
 /// <param name="templateId">the template identifier</param>
 private void AddTemplate(byte[] template, short templateId)
 {
     Debug.Assert(templateId <= compressors.Count);
     TemplateBasedCompressor ct = new TemplateBasedCompressor(templateId, template, useHuff);
     if (templateId < compressors.Count)
     {
         /*if this template is the same from before, we don't want to lose all the announcements
          * we know from before.  If we already have this exact template, it could be that someone
          * else requested it and it was broadcast to everyone.*/
         if (ct.Equals(compressors[templateId])) { return; }
         /*else we should get rid of the old and bring in the new*/
         compressors[templateId] = ct;
         return;
     }
     //we haven't seen this before, add it; throws an exception if templateId > compressors.Count
     compressors.Insert(templateId, ct);
 }
        /// <summary>
        /// if we know a template that we would like to construct, we can give it to the Handler, 
        /// and it will add it.  
        /// </summary>
        /// <param name="template"></param>
        /// <returns></returns>
        public short ConstructTemplate(byte[] template)
        {
            // for the duration of this method, lastTemplateId is the current templateId.
            short templateId;
            lock (this)
            {
                templateId = lastTemplateId = (short)((lastTemplateId + 1) % maximumTemplates);
            }

            Debug.Assert(templateId <= compressors.Count);

            TemplateBasedCompressor ct = new TemplateBasedCompressor(templateId, template, useHuff);
            if (templateId == compressors.Count) { compressors.Add(ct); }
            else { compressors[templateId] = ct; }
            return templateId;
        }