лёгкая STL библиотека

Тема в разделе "LANGS.C", создана пользователем cupuyc, 7 май 2010.

  1. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    500LOC не мало. Я говорил про http://apotheca.hpl.hp.com/ftp/stl/stl.zip Автоптр не имеет, выдирать из STLPort не много сложнее чем из http://www.sgi.com/tech/stl/memory или http://code.google.com/p/ontl/source/browse/branches/x64/ntl/stlx/smart_ptr.hxx
     
  2. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    J0E, спасибо большое. STLX рулит.
     
  3. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    хотя, нет, погорячился. STLX привязана к VC, мало того, имеет кучу багов, которые всплывают на gcc.
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    уууфффф.. день работы и получилось подрубить sgi :)))
    рабочий код, кому интересно
    1. переименовал все файлики vеctor -> vector.hxx, list->list.hxx... чтобы не создавать путаницы между стандартным stl и новым.
    2. поправил ссылки в инклудах: #include <vector.hxx>, #include <list.hxx> и т.д.
    3. создал файлик new.h с определением операторов new, delete.
    4. определил следующие флаги:

    #define __STL_HAS_NAMESPACES
    #define __STL_USE_NEW_IOSTREAMS
    #define __STL_CLASS_PARTIAL_SPECIALIZATION
    #define __STL_NO_EXCEPTION_HEADER

    5. вот кодес, компилящийся на Keil:

    Код (Text):
    1. #include <at91sam7s256.h>
    2. #include <lib_at91sam7s256.h>
    3.  
    4. #define __STL_HAS_NAMESPACES
    5. #define __STL_USE_NEW_IOSTREAMS
    6. #define __STL_CLASS_PARTIAL_SPECIALIZATION
    7. #define __STL_NO_EXCEPTION_HEADER
    8.  
    9. #include <list.hxx>
    10.  
    11. int main()
    12. {
    13.   std::list<char> x;
    14.   char c;
    15.  
    16.   x.push_back('a');
    17.   x.push_back('b');
    18.   x.push_back('c');
    19.  
    20.   for (std::list<char>::iterator i = x.begin(); i != x.end(); i ++)
    21.   {
    22.     c = *i;
    23.     c ++;
    24.   }
    25. }
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cupuyc
    А с new/delete что придумал?
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    осталась проблемка с std::string. строки отказываются работать. вылазит ошибка Error[Pe070]: incomplete type is not allowed. компилятору не нравится вот такие конструкции
    Код (Text):
    1. unsigned int x = ios::left;
    или
    Код (Text):
    1. const bool __left = (__os.flags() & ios::left) != 0;
    , т.е. обращение к статическим членам класса ios. странно, конечно. такие вещи спокойно компилятся:
    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.   static const int x = 3245;
    5. };
    6.  
    7. int main()
    8. {
    9.   unsigned int x = Cx::x;
    10.   return 0;
    11. }
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Похоже что там где нужно полное определение ios инклудится только iosfwd (то есть его forward declaration).
     
  8. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Заявлена поддержка GCC 4.3+ значит баги должны исправить если о них сообщить.
     
  9. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    ну, не знаю, что там заявлено. вот кусок кода, которые принципиально не будет компилиться ни на чём, кроме VC:
    Код (Text):
    1. #ifndef NTL__EXTERNAPI
    2.   #ifdef  _MSC_VER
    3.     #define NTL__EXTERNAPI extern "C" __declspec(dllimport)
    4.   #else
    5.     #error usupported compiler
    6.   #endif
    7. #endif
    А вот это вообще какая-то глупость. Что за "I Love MSVC 2005!" ?
    Код (Text):
    1. typedef struct
    2. {
    3.     template<typename any> operator any * () const { return 0; }
    4.     template<class any, typename T> operator T any:: * () const { return 0; }
    5.   private:
    6.   //  nullptr_t();// {}
    7.   //  nullptr_t(const nullptr_t&);
    8.   //  void operator = (const nullptr_t&);
    9.     void operator & ();
    10.     template<typename any> void operator +(any) const { I Love MSVC 2005! }
    11.     template<typename any> void operator -(any) const { I Love MSVC 2005! }
    12. //    void * _;
    13. } nullptr_t;
    далее. на такой код компилятор выдаёт (имхо, вполне логично): "Error[Pe020]: identifier "T" is undefined". Что за T?
    Код (Text):
    1. template<class ForwardIterator1, class ForwardIterator2>
    2. __forceinline
    3. void
    4.   iter_swap(ForwardIterator1 a, ForwardIterator2 b)
    5. {
    6.   T temp( *a );
    7.   *a = *b;
    8.   *b = temp;
    9. }
    далее, ещё одной ';' не хватает.
    Код (Text):
    1. for ( first != last; ++first, ++result )
    ну, уж такие явные баги любой компилятор увидит. почему не видит VC? ну.. скорее всего потому, что он просто не проверяет синтаксис у неиспользуемых шаблонов.
     
  10. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Note that trunk/ntl codebase is not supported and deprecated

    Актуальный код в branches/x64. Для GCC отдельный branches/stlx но похоже несколько устарел.
     
  11. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Кстати, удивительная вещь. Есть коммерческий компилятор для ARM'ов - IAR. В состав входит своя STL библиотека. Примечательно, что качество кода в этой библиотеке получается ниже, чем у SGI. Качество ниже как по быстродействию (примерно в ~2 раза) так и по размеру (~10%). Хотя SGI вообще не рассчитана на всякие там ARM'ы :)))
     
  12. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    Вообще говоря, SGI частично компилируется. Указатели, списки работают даже лучше чем я ожидал. Мне этого, как-бы, достаточно. Жаль, конечно, что со строками проблема. По ходу пьесы буду разбираться где собака зарыта. _DEN_, да, видимо что-то с последовательностью описания классов.
     
  13. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Проблема с basic_string из SGI вот где:

    // file <string>
    #ifdef __STL_USE_NEW_IOSTREAMS
    #include <iosfwd>
    #else /* __STL_USE_NEW_IOSTREAMS */
    #include <char_traits.h>
    #endif /* __STL_USE_NEW_IOSTREAMS */

    Откуда берется <iosfwd>? не нашел в библиотеке. Не надо #define __STL_USE_NEW_IOSTREAMS и не будет оператор <<
     
  14. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
    Не создаются ли проблемы на ровном месте? GCC имеет libcpp, чем не устраивает, если не нужны стримы то list header-only ?
     
  15. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    тем, что я не использую gcc.
     
  16. J0E

    J0E New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    621
    Адрес:
    Panama
     
  17. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    J0E, его я привёл в качестве примера. Когда пробовал подключить взял сначала на VC - всё заработало. Затем попробовал на Keil'е - там вылезла куча ошибок. Попробовал на CodeBlocks - опять вылезла куча ошибок. В gcc я решил проверить потому, что он более строг к стандарту. А вообще я не сторонник написания софта на GCC с последующей отладкой под GDB. Это по части мазахистов.