1  /*
   2   * \brief  Utility for handling strings as AVL-node keys
   3   * \author Norman Feske
   4   * \date   2006-07-12
   5   */

   6  
   7  /*
   8   * Copyright (C) 2006-2013 Genode Labs GmbH
   9   *
  10   * This file is part of the Genode OS framework, which is distributed
  11   * under the terms of the GNU General Public License version 2.
  12   */

  13  
  14  #ifndef _INCLUDE__UTIL__AVL_STRING_H_
  15  #define _INCLUDE__UTIL__AVL_STRING_H_
  16  
  17  #include <util/avl_tree.h>
  18  #include <util/string.h>
  19  
  20  namespace Genode {
  21     
  22     class Avl_string_base;
  23     template <int> class Avl_string;
  24  }

  25  
  26  
  27  class Genode::Avl_string_base : public Avl_node<Avl_string_base>
  28  {
  29     private:
  30  
  31        const char *_str;
  32  
  33     protected:
  34  
  35        /**
  36         * Constructor
  37         *
  38         * \noapi
  39         */

  40        Avl_string_base(const char *str) : _str(str) { }

  41  
  42     public:
  43  
  44        const char *name() const { return _str; }
  45  
  46  
  47        /************************
  48         ** Avl node interface **
  49         ************************/

  50  
  51        bool higher(Avl_string_base *c) { return (strcmp(c->_str, _str) > 0); }
  52  
  53        /**
  54         * Find by name
  55         */

  56        Avl_string_base *find_by_name(const char *name)
  57        {
  58           if (strcmp(name, _str) == 0) return this;
  59  
  60           Avl_string_base *= Avl_node<Avl_string_base>::child(strcmp(name, _str) > 0);
  61           return c ? c->find_by_name(name) : 0;

  62        }

  63  }
;

  64  
  65  
  66  /*
  67   * The template pumps up the Avl_string_base object and provides the buffer for
  68   * the actual string.
  69   */

  70  template <int STR_LEN>
  71  class Genode::Avl_string : public Avl_string_base
  72  {
  73     private:
  74  
  75        char _str_buf[STR_LEN];

  76  
  77     public:
  78  
  79        Avl_string(const char *str) : Avl_string_base(_str_buf)
  80        {
  81           strncpy(_str_buf, str, sizeof(_str_buf));
  82           _str_buf[STR_LEN - 1] = 0;

  83        }

  84  }
;

  85  
  86  #endif /* _INCLUDE__UTIL__AVL_STRING_H_ */