[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#392559: avifile build failure



Matthias Klose wrote:
> Hi,
> 
> would it be possible for you to have a look at avifile to work around
> #392559 by changing the avifile code?

Done.  If we add "template" as suggested, the compiler just gets more
confused.  But these member templates don't need to be doubly templated;
they are only ever instantiated for the same Key and Value as the
enclosing template.  So we can lift them right out and avoid the problem
entirely:

--- avifile-0.7.44.20051021.orig/include/avm_map.h	2004-02-19 11:39:56.000000000 +0000
+++ avifile-0.7.44.20051021/include/avm_map.h	2006-10-22 01:37:30.000000000 +0000
@@ -28,47 +28,48 @@
     bool operator()(const Key& k1, const Key& k2) const { return k1==k2; }
 };
 
+template <class Key, class Value> struct _avm_map_pair
+{
+    Key key;
+    Value value;
+    _avm_map_pair() : key(Key()), value(Value()) {}
+    _avm_map_pair(Key k, Value v) : key(k), value(v) {}
+    _avm_map_pair(const _avm_map_pair<Key, Value>& p) : key(p.key), value(p.value) {}
+};
+
+template <class Key, class Value> struct _avm_map_binary_tree_node
+{
+    _avm_map_pair<Key, Value>* entry;
+    _avm_map_binary_tree_node<Key, Value>* left;
+    Key minval;
+    _avm_map_binary_tree_node<Key, Value>* right;
+    _avm_map_binary_tree_node<Key, Value>* parent;
+    Key maxval;
+    _avm_map_binary_tree_node(_avm_map_binary_tree_node<Key, Value>* ptr=0) : entry(0), left(0), right(0), parent(ptr), weight(1) {}
+    int weight;
+    void destroy()
+    {
+	if(left)
+	{
+	    left->destroy();
+	    delete left;
+	}
+	if(right)
+	{
+	    right->destroy();
+	    delete right;
+	}
+	delete entry;
+    }
+};
+
 // do not use this container in time critical context
 // search time is between log(N) and N, depending on order of element insertion
 template <class Key, class Value, class Compare = less<Key>, class equal = equal<Key> > class avm_map
 {
 protected:
-    template <class Key1, class Value1> struct pair
-    {
-	Key1 key;
-	Value1 value;
-	pair() : key(Key()), value(Value()) {}
-	pair(Key1 k, Value1 v) : key(k), value(v) {}
-	pair(const pair<Key1, Value1>& p) : key(p.key), value(p.value) {}
-    };
-    typedef pair<Key, Value> _Tpair;
-
-    template <class Key1, class Value1> struct binary_tree_node
-    {
-	avm_map::pair<Key1, Value1>* entry;
-	binary_tree_node<Key1, Value1>* left;
-	Key1 minval;
-	binary_tree_node<Key1, Value1>* right;
-	binary_tree_node<Key1, Value1>* parent;
-	Key1 maxval;
-	binary_tree_node(binary_tree_node<Key1, Value1>* ptr=0) : entry(0), left(0), right(0), parent(ptr), weight(1) {}
-	int weight;
-	void destroy()
-	{
-	    if(left)
-	    {
-		left->destroy();
-		delete left;
-	    }
-	    if(right)
-	    {
-		right->destroy();
-		delete right;
-	    }
-	    delete entry;
-	}
-    };
-    typedef binary_tree_node<Key, Value> _Tnode;
+    typedef _avm_map_pair<Key, Value> _Tpair;
+    typedef _avm_map_binary_tree_node<Key, Value> _Tnode;
 
     _Tnode* m_pTree;
     Value* m_pDefaultValue;
@@ -190,7 +191,7 @@
 template <class Key, class Value, class Compare, class Equal> avm_map<Key, Value, Compare, Equal>::avm_map()
 {
     m_pTree=new _Tnode;
-    m_pTree->entry = new pair<Key, Value>;
+    m_pTree->entry = new _Tpair;
     m_pDefaultValue=&(m_pTree->entry->value);
 }
 
@@ -268,14 +269,14 @@
 	    if(m_sC(ptr->entry->key, key))
 	    {
 		ptr->left->entry=ptr->entry;
-		ptr->right->entry=new pair<Key, Value>(key, value);
+		ptr->right->entry=new _Tpair(key, value);
 		ptr->entry=0;
 		update_min_max_weights(ptr);
 		return &(ptr->right->entry->value);
 	    }
 	    else
 	    {
-		ptr->left->entry=new pair<Key, Value>(key, value);
+		ptr->left->entry=new _Tpair(key, value);
 		ptr->right->entry=ptr->entry;
 		ptr->entry=0;
 		update_min_max_weights(ptr);
@@ -305,14 +306,14 @@
 	if(!ptr->left)
 	{
 	    ptr->left=new _Tnode(ptr);
-	    ptr->left->entry=new pair<Key, Value>(key, value);
+	    ptr->left->entry=new _Tpair(key, value);
 	    update_min_max_weights(ptr);
 	    return &(ptr->left->entry->value);
 	}
 	if(!ptr->right)
 	{
 	    ptr->right=new _Tnode(ptr);
-	    ptr->right->entry=new pair<Key, Value>(key, value);
+	    ptr->right->entry=new _Tpair(key, value);
 	    update_min_max_weights(ptr);
 	    return &(ptr->right->entry->value);
 	}
-- END --

I don't know whether the resulting code works though...

> Apparently that the only package in testing failing with the current
> gcc-4.1.

That's because we don't have enough unit tests to find the subtle code
generation bugs.

Ben.

-- 
Ben Hutchings -- ben@decadentplace.org.uk shortened to ben@decadent.org.uk
If you've signed my GPG key, please send a signature on and to the new uid.
In a hierarchy, every employee tends to rise to his level of incompetence.

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: